Merge lp:~brian-murray/arsenal/patches-and-branches into lp:~bryce/arsenal/2.x

Proposed by Brian Murray
Status: Merged
Approved by: Bryce Harrington
Approved revision: 1102
Merged at revision: 1103
Proposed branch: lp:~brian-murray/arsenal/patches-and-branches
Merge into: lp:~bryce/arsenal/2.x
Diff against target: 632 lines (+604/-2)
3 files modified
scripts/collect-bug-data (+4/-0)
scripts/reporter (+6/-2)
web/templates/bugs-by-team-fixes.mako (+594/-0)
To merge this branch: bzr merge lp:~brian-murray/arsenal/patches-and-branches
Reviewer Review Type Date Requested Status
Bryce Harrington Pending
Review via email: mp+123594@code.launchpad.net

Description of the change

Collect information about linked branches and patches for bug reports. Then created a new web template to show these in a report.

To post a comment you must log in.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'scripts/collect-bug-data'
--- scripts/collect-bug-data 2012-08-02 17:34:21 +0000
+++ scripts/collect-bug-data 2012-09-10 16:19:21 +0000
@@ -832,6 +832,10 @@
832 b['last_update'] = '%d' % self.how_long_ago(updated)[0]832 b['last_update'] = '%d' % self.how_long_ago(updated)[0]
833833
834 (b['series_name'], b['series_version']) = bug.series834 (b['series_name'], b['series_version']) = bug.series
835 b['latest_patch_uploaded'] = date_to_string(bug.date_latest_patch_uploaded)
836 b['linked_branches'] = []
837 for branch in bug.lpbug.linked_branches:
838 b['linked_branches'].append(branch.web_link)
835839
836 # LiveMediaBuild property840 # LiveMediaBuild property
837 #841 #
838842
=== modified file 'scripts/reporter'
--- scripts/reporter 2012-05-16 20:36:07 +0000
+++ scripts/reporter 2012-09-10 16:19:21 +0000
@@ -239,8 +239,12 @@
239 for bug_task in bd['tasks'][bid]:239 for bug_task in bd['tasks'][bid]:
240 task = {}240 task = {}
241 task['bug'] = {}241 task['bug'] = {}
242 for k in ['title', 'series_name', 'number_of_messages', 'number_subscribed', 'number_affected', 'iso_date_created', 'last_update', 'series_version', 'number_of_duplicates']:242 for k in ['title', 'series_name', 'number_of_messages',
243 # in the event that a key doesn't exist in the json file set it to ''243 'number_subscribed', 'number_affected', 'iso_date_created',
244 'last_update', 'series_version', 'number_of_duplicates',
245 'latest_patch_uploaded', 'linked_branches']:
246 # in the event that a key doesn't exist in the json file
247 # set it to ''
244 try:248 try:
245 task['bug'][k] = bug_task['bug'][k]249 task['bug'][k] = bug_task['bug'][k]
246 except KeyError:250 except KeyError:
247251
=== added file 'web/templates/bugs-by-team-fixes.mako'
--- web/templates/bugs-by-team-fixes.mako 1970-01-01 00:00:00 +0000
+++ web/templates/bugs-by-team-fixes.mako 2012-09-10 16:19:21 +0000
@@ -0,0 +1,594 @@
1<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
2<%
3 importance_color = {
4 "Unknown" : "importance-unknown",
5 "Critical" : "importance-critical",
6 "High" : "importance-high",
7 "Medium" : "importance-medium",
8 "Low" : "importance-low",
9 "Wishlist" : "importance-wishlist",
10 "Undecided" : "importance-undecided"
11 }
12 status_color = {
13 "New" : "status-new",
14 "Incomplete" : "status-incomplete",
15 "Confirmed" : "status-confirmed",
16 "Triaged" : "status-triaged",
17 "In Progress" : "status-in_progress",
18 "Fix Committed" : "status-fix_committed",
19 "Fix Released" : "status-fix_released",
20 "Invalid" : "status-invalid",
21 "Won't Fix" : "status-wont_fix",
22 "Opinion" : "status-opinion",
23 "Expired" : "status-expired",
24 "Unknown" : "status-unknown"
25 }
26
27 bugs_by_team = {}
28 tasks = template_data['tasks']
29 for bid in tasks:
30 for t in tasks[bid]:
31 team = 'unknown' if t['team'] == '' else t['team']
32
33 if team not in bugs_by_team:
34 bugs_by_team[team] = {}
35
36 if bid not in bugs_by_team[team]:
37 bugs_by_team[team][bid] = []
38
39 if t['bug_target_name'] not in bugs_by_team[team][bid]:
40 bugs_by_team[team][bid].append(t['bug_target_name'])
41
42 team_report_order = []
43 if 'unknown' in bugs_by_team:
44 team_report_order.append('unknown') # We want unknown first
45 for t in sorted(bugs_by_team):
46 if t != 'unknown':
47 team_report_order.append(t)
48
49 report_options = template_data['report']
50%>
51<html xmlns="http://www.w3.org/1999/xhtml" dir="ltr" lang="en-US">
52 <head>
53 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
54 <title>${report_title}</title>
55
56 <link title="light" rel="stylesheet" href="http://people.canonical.com/~kernel/reports/css/light-style.css" type="text/css" media="print, projection, screen" />
57 <link title="dark" rel="stylesheet" href="http://people.canonical.com/~kernel/reports/css/dark-style.css" type="text/css" media="print, projection, screen" />
58
59 <script type="text/javascript" src="http://people.canonical.com/~kernel/reports/js/styleswitcher.js"></script>
60
61 <link href='http://fonts.googleapis.com/css?family=Cantarell&subset=latin' rel='stylesheet' type='text/css'>
62 <script type="text/javascript" src="http://people.canonical.com/~kernel/reports/js/jquery-latest.js"></script>
63 <script type="text/javascript" src="http://people.canonical.com/~kernel/reports/js/jquery.tablesorter.js"></script>
64
65 </head>
66
67
68 <body class="bugbody">
69 <!-- Top Panel -->
70 <div id="toppanel">
71 <!-- Sliding Panel
72 -->
73 <div id="panel">
74 <form name="filter">
75 <div class="content clearfix">
76
77 <table width="100%">
78 <tr valign="top">
79 <td valign="top" width="30%">
80 <p class="l2-section-heading">Importance</p>
81 <table width="100%">
82 <tr><td width="50%"> <input type="checkbox" name="importance" onclick="importance_handler(this, 'importance', true)" checked value="Critical" /> Critical </td>
83 <td width="50%"> <input type="checkbox" name="importance" onclick="importance_handler(this, 'importance', true)" checked value="Low" /> Low </td></tr>
84 <tr><td width="50%"> <input type="checkbox" name="importance" onclick="importance_handler(this, 'importance', true)" checked value="High" /> High </td>
85 <td width="50%"> <input type="checkbox" name="importance" onclick="importance_handler(this, 'importance', true)" checked value="Wishlist" /> Wishlist </td></tr>
86 <tr><td width="50%"> <input type="checkbox" name="importance" onclick="importance_handler(this, 'importance', true)" checked value="Medium" /> Medium </td>
87 <td width="50%"> <input type="checkbox" name="importance" onclick="importance_handler(this, 'importance', true)" checked value="Undecided" /> Undecided </td></tr>
88 </table>
89 </td>
90
91 <td width="20">&nbsp;</td>
92
93 <td valign="top">
94 <p class="l2-section-heading">Status</p>
95 <table width="100%">
96 <tr><td width="50%"> <input type="checkbox" name="status" onclick="status_handler(this, 'status', true)" checked value="New" /> New </td>
97 <td width="50%"> <input type="checkbox" name="status" onclick="status_handler(this, 'status', true)" checked value="Incomplete" /> Incomplete </td></tr>
98 <tr><td width="50%"> <input type="checkbox" name="status" onclick="status_handler(this, 'status', true)" checked value="Confirmed" /> Confirmed </td>
99 <td width="50%"> <input type="checkbox" name="status" onclick="status_handler(this, 'status', true)" checked value="Fix Released" /> Fix Released </td></tr>
100 <tr><td width="50%"> <input type="checkbox" name="status" onclick="status_handler(this, 'status', true)" checked value="Triaged" /> Triaged </td>
101 <td width="50%"> <input type="checkbox" name="status" onclick="status_handler(this, 'status', true)" checked value="Won't Fix" /> Won't Fix </td></tr>
102 <tr><td width="50%"> <input type="checkbox" name="status" onclick="status_handler(this, 'status', true)" checked value="In Progress" /> In Progress </td>
103 <td width="50%"> <input type="checkbox" name="status" onclick="status_handler(this, 'status', true)" checked value="Opinion" /> Opinion </td></tr>
104 <tr><td width="50%"> <input type="checkbox" name="status" onclick="status_handler(this, 'status', true)" checked value="Fix Committed" /> Fix Committed </td>
105 <td width="50%"> <input type="checkbox" name="status" onclick="status_handler(this, 'status', true)" checked value="Invalid" /> Invalid </td></tr>
106 </table>
107 </td>
108
109 <td width="20">&nbsp;</td>
110
111 <td valign="top" width="30%">
112 <p class="l2-section-heading">Series</p>
113 <table width="100%">
114 <tr><td width="50%"> <input type="checkbox" name="series" onclick="series_handler(this, 'series', true)" checked value="quantal" /> Quantal </td></tr>
115 <tr><td width="50%"> <input type="checkbox" name="series" onclick="series_handler(this, 'series', true)" checked value="precise" /> Precise </td>
116 <td width="50%"> <input type="checkbox" name="series" onclick="series_handler(this, 'series', true)" checked value="jaunty" /> Jaunty </td></tr>
117 <tr><td width="50%"> <input type="checkbox" name="series" onclick="series_handler(this, 'series', true)" checked value="oneiric" /> Oneiric </td>
118 <td width="50%"> <input type="checkbox" name="series" onclick="series_handler(this, 'series', true)" checked value="karmic" /> Karmic </td></tr>
119 <tr><td width="50%"> <input type="checkbox" name="series" onclick="series_handler(this, 'series', true)" checked value="natty" /> Natty </td>
120 <td width="50%"> <input type="checkbox" name="series" onclick="series_handler(this, 'series', true)" checked value="hardy" /> Hardy </td></tr>
121 <tr><td width="50%"> <input type="checkbox" name="series" onclick="series_handler(this, 'series', true)" checked value="maverick" /> Maverick </td>
122 <td width="50%"> <input type="checkbox" name="series" onclick="series_handler(this, 'series', true)" checked value="" /> Unknown </td></tr>
123 <tr><td width="50%"> <input type="checkbox" name="series" onclick="series_handler(this, 'series', true)" checked value="lucid" /> Lucid </td></tr>
124 </table>
125 </td>
126
127 </tr>
128
129 <!--
130 <tr valign="top">
131
132 <td valign="top" width="30%" colspan="5">
133 <p class="l2-section-heading">Assignee</p>
134 <table width="100%">
135 % for i, elem in enumerate(assignees_list):
136 % if i % 5 == 0:
137 <tr>
138 % endif
139 <td width="20%"> <input type="checkbox" name="assignees" onclick="assignee_handler(this, 'series', true)" checked value="${assignees_list[i]}" /> ${assignees_list[i]} </td>
140 % if i % 5 == 4:
141 </tr>
142 % endif
143 % endfor
144 </table>
145 </td>
146 </tr>
147
148 <tr valign="top">
149
150 <td valign="top">
151 <p class="l2-section-heading">Date</p>
152 <table width="100%">
153 <tr><td colspan="4">Created within:</td></tr>
154 <tr><td width="10">&nbsp;</td>
155 <td width="50"> <input type="radio" name="date" onclick="date_handler(this, 'date', true)" checked value="1" /> 24 Hrs. </td>
156 <td width="50"> <input type="radio" name="date" onclick="date_handler(this, 'date', true)" checked value="7" /> 1 Week </td>
157 <td width="50"> <input type="radio" name="date" onclick="date_handler(this, 'date', true)" checked value="30" /> 1 Month </td></tr>
158 <tr><td width="10">&nbsp;</td>
159 <td width="50"> <input type="radio" name="date" onclick="date_handler(this, 'date', true)" checked value="-1" /> Unlimited </td></tr>
160 </table>
161 </td>
162
163 <td width="20">&nbsp;</td>
164
165 <td valign="top">
166 &nbsp;
167 </td>
168
169 <td width="20">&nbsp;</td>
170
171 <td valign="top">
172 &nbsp;
173 </td>
174 </tr>
175 -->
176
177 </table>
178
179 </div>
180 </form>
181
182 <div style="clear:both;"></div>
183 </div> <!-- panel -->
184
185 <!-- The tab on top -->
186 <div class="tab">
187 <ul class="login">
188 <li class="left">&nbsp;</li>
189 <li id="toggle">
190 <a id="open" class="open" href="#">&nbsp;Options</a>
191 <a id="close" style="display: none;" class="close" href="#">&nbsp;Close&nbsp;&nbsp;</a>
192 </li>
193 <li class="right">&nbsp;</li>
194 </ul>
195 </div> <!-- / top -->
196 </div> <!-- Top Panel -->
197
198 <div class="outermost">
199 <div class="title">
200 ${report_title}
201 </div>
202 <div class="section">
203 % for team in team_report_order:
204 % if 'show_total_bugs_per_team' in report_options and report_options['show_total_bugs_per_team']:
205 <% total = len(bugs_by_team[team].keys()) %>
206 <div class="section-heading">${team}&nbsp;&nbsp;(<span id="${team}-total">${total}</span>)</div>
207 % else:
208 <div class="section-heading">${team}</div>
209 % endif
210
211 <% id = team.replace(' ', '_') %>
212 <table id="${id}" class="tablesorter" border="0" cellpadding="0" cellspacing="1" width="100%%">
213 <thead>
214 <tr>
215 <th width="40">Bug</th>
216 <th>Summary</th>
217 <th width="100">Package</th>
218 <th width="80">Importance</th>
219 <th width="80">Status</th>
220 <th width="140">Assignee</th>
221 <th width="60">Found</th>
222 <th width="60">Target</th>
223 <th width="100">Created</th>
224 <th width="40">Fixes</th>
225 </tr>
226 </thead>
227 <tbody>
228 </tbody>
229 </table>
230 % endfor
231
232 </div>
233 <br />
234 <br />
235 <div>
236 % if 'show_total_bugs' in report_options and report_options['show_total_bugs']:
237 <div id="bug-total">Total: 000</div>
238 % endif
239
240 </div>
241 <div>
242 <br />
243 <hr />
244 <table width="100%%" cellspacing="0" cellpadding="0">
245 <thead>
246 <tr>
247 <td width="100">Column</td>
248 <td>Description</td>
249 </tr>
250 </th>
251 <tbody>
252 <tr><td>Bug </td><td>The Launchpad Bug number and a link the the Launchpad Bug. </td></tr>
253 <tr><td>Summary </td><td>The 'summary' or 'title' from the bug. </td></tr>
254 <tr><td>Package </td><td>The package a bug task was created for relating to the specific bug. </td></tr>
255 <tr><td>Importance</td><td>The bug task's importance. </td></tr>
256 <tr><td>Status </td><td>The bug task's status. </td></tr>
257 <tr><td>Assignee </td><td>The person or team assigned to work on the bug. </td></tr>
258 <tr><td>Found </td><td>The milestone during which the bug was found. </td></tr>
259 <tr><td>Target </td><td>The milestone the bug task is targeted to be fixed. </td></tr>
260 <tr><td>Created </td><td>The date the bug was created the value in parens is age in days. </td></tr>
261 <tr><td>Fixes </td><td>Icons indicating if the bug has a patch or branch. </td></tr>
262 </tbody>
263 </table>
264 <br />
265 </div>
266 <div>
267 <br />
268 <hr />
269 <table width="100%%" cellspacing="0" cellpadding="0">
270 <tr>
271 <td>
272 ${timestamp}
273 </td>
274 <td align="right">
275 &nbsp;
276 Themes:&nbsp;&nbsp;
277 <a href='#' onclick="setActiveStyleSheet('dark'); return false;">DARK</a>
278 &nbsp;
279 <a href='#' onclick="setActiveStyleSheet('light'); return false;">LIGHT</a>
280 </td>
281 </tr>
282 </table>
283 <br />
284 </div>
285
286
287 </div> <!-- Outermost -->
288 </body>
289
290 <script type="text/javascript">
291 // add parser through the tablesorter addParser method
292 $.tablesorter.addParser({
293 // set a unique id
294 id: 'age',
295 is: function(s) { return false; },
296 format: function(s) {
297 // format your data for normalization
298 fields = s.split('.')
299 days = parseInt(fields[0], 10) * (60 * 24);
300 hours = parseInt(fields[1], 10) * 60;
301 minutes = parseInt(fields[2]);
302 total = minutes + hours + days
303 return total;
304 },
305 // set type, either numeric or text
306 type: 'numeric'
307 });
308
309 // add parser through the tablesorter addParser method
310 $.tablesorter.addParser({
311 // set a unique id
312 id: 'importance',
313 is: function(s) { return false; },
314 format: function(s) {
315 // format your data for normalization
316 return s.toLowerCase().replace(/critical/,6).replace(/high/,5).replace(/medium/,4).replace(/low/,3).replace(/wishlist/,2).replace(/undecided/,1).replace(/unknown/,0);
317 },
318 // set type, either numeric or text
319 type: 'numeric'
320 });
321
322 // add parser through the tablesorter addParser method
323 $.tablesorter.addParser({
324 // set a unique id
325 id: 'status',
326 is: function(s) { return false;
327 },
328 format: function(s) {
329 // format your data for normalization
330 return s.toLowerCase().replace(/new/,12).replace(/incomplete/,11).replace(/confirmed/,10).replace(/triaged/,9).replace(/in progress/,8).replace(/fix committed/,7).replace(/fix released/,6).replace(/invalid/,5).replace(/won't fix/,4).replace(/confirmed/,3).replace(/opinion/,2).replace(/expired/,1).replace(/unknown/,0);
331 },
332 // set type, either numeric or text
333 type: 'numeric'
334 });
335 $(function() {
336 % for team in team_report_order:
337 <% id = team.replace(' ', '_') %>
338 $("#${id}").tablesorter({
339 headers: {
340 3: {
341 sorter:'importance'
342 },
343 4: {
344 sorter:'status'
345 }
346 },
347 widgets: ['zebra']
348 });
349 % endfor
350 });
351 </script>
352
353 <script type="text/javascript">
354 var series = ["precise", "jaunty", "oneiric", "karmic", "natty", "hardy", "maverick", "lucid", ""];
355 var importance = ["Critical", "Low", "High", "Wishlist", "Medium", "Undecided"];
356 var task_status = ["New", "Incomplete", "Confirmed", "Fix Released", "Triaged", "Won't Fix", "In Progress", "Opinion", "Fix Committed", "Invalid"];
357 var assignees = [];
358 var date_filter = -1;
359 var jd = ${json_data_string};
360 var first_time = true;
361
362 var importance_color = {
363 "Unknown" : "importance-unknown",
364 "Critical" : "importance-critical",
365 "High" : "importance-high",
366 "Medium" : "importance-medium",
367 "Low" : "importance-low",
368 "Wishlist" : "importance-wishlist",
369 "Undecided" : "importance-undecided"
370 };
371
372 var status_color = {
373 "New" : "status-new",
374 "Incomplete" : "status-incomplete",
375 "Confirmed" : "status-confirmed",
376 "Triaged" : "status-triaged",
377 "In Progress" : "status-in_progress",
378 "Fix Committed" : "status-fix_committed",
379 "Fix Released" : "status-fix_released",
380 "Invalid" : "status-invalid",
381 "Won't Fix" : "status-wont_fix",
382 "Opinion" : "status-opinion",
383 "Expired" : "status-expired",
384 "Unknown" : "status-unknown"
385 };
386
387 var teams_id_list = [];
388 var teams_name_list = [];
389 % for team in team_report_order:
390 <% id = team.replace(' ', '_') %>
391 teams_id_list.push("${id}");
392 teams_name_list.push("${team}");
393 % endfor
394
395 function series_handler(chkbx, grp, update_table) {
396 series = [];
397 for (i = 0; i < document.filter.length; i++) {
398 if (document.filter[i].name == "series") {
399 if (document.filter[i].checked) {
400 series.push(document.filter[i].value);
401 }
402 }
403 }
404
405 if (update_table) {
406 update_tables();
407 }
408 }
409
410 function importance_handler(chkbx, grp, update_table) {
411 importance = [];
412 for (i = 0; i < document.filter.length; i++) {
413 if (document.filter[i].name == "importance") {
414 if (document.filter[i].checked) {
415 importance.push(document.filter[i].value);
416 }
417 }
418 }
419
420 if (update_table) {
421 update_tables();
422 }
423 }
424
425 function assignee_handler(chkbx, grp, update_table) {
426 assignees = [];
427 for (i = 0; i < document.filter.length; i++) {
428 if (document.filter[i].name == "assignees") {
429 if (document.filter[i].checked) {
430 assignees.push(document.filter[i].value);
431 }
432 }
433 }
434
435 if (update_table) {
436 update_tables();
437 }
438 }
439
440 function status_handler(chkbx, grp, update_table) {
441 task_status = [];
442 for (i = 0; i < document.filter.length; i++) {
443 if (document.filter[i].name == "status") {
444 if (document.filter[i].checked) {
445 task_status.push(document.filter[i].value);
446 }
447 }
448 }
449
450 if (update_table) {
451 update_tables();
452 }
453 }
454
455 function date_handler(chkbx, grp, update_table) {
456 date_filter = -1;
457 for (i = 0; i < document.filter.length; i++) {
458 if (document.filter[i].name == "date") {
459 if (document.filter[i].checked) {
460 date_filter = parseInt(document.filter[i].value);
461 }
462 }
463 }
464
465 if (update_table) {
466 update_tables();
467 }
468 }
469
470 function update_tables() {
471 var bug_total = 0;
472 var tables = {
473 % for team in team_report_order:
474 "${team}" : "",
475 % endfor
476 };
477 var totals = {
478 % for team in team_report_order:
479 "${team}" : 0,
480 % endfor
481 };
482
483 var oddness = {
484 % for team in team_report_order:
485 "${team}" : true,
486 % endfor
487 };
488
489 $.each(jd, function(bid, tasks) {
490 $.each(tasks, function(index, task) {
491 var fail = false;
492
493 if (series.indexOf(task.bug.series_name) == -1) {
494 fail = true;
495 }
496
497 if (!fail && importance.indexOf(task.importance) == -1) {
498 fail = true;
499 }
500
501 if (!fail && task_status.indexOf(task.status) == -1) {
502 fail = true;
503 }
504
505 /*
506 if (!fail && assignees.indexOf(task.assignee) == -1) {
507 fail = true;
508 }
509
510 if (!fail && date_filter != -1) {
511 if (task.bug.age > date_filter) {
512 fail = true;
513 }
514 }
515 */
516
517 s = "";
518 if (!fail) {
519 bug_total++;
520 if (oddness[task.team]) {
521 s += "<tr class=\"odd\">";
522 oddness[task.team] = false;
523 } else {
524 s += "<tr class=\"even\">";
525 oddness[task.team] = true;
526 }
527 s += "<td><a href=\"http://launchpad.net/bugs/" + bid + "\">" + bid + "</a></td>";
528 s += "<td>" + task.bug.title + "</td>";
529 s += "<td>" + task.task_name + "</td>";
530 s += "<td class=\"" + importance_color[task.importance] + "\">" + task.importance + "</td>";
531 s += "<td class=\"" + status_color[task.status] + "\">" + task.status + "</td>";
532 s += "<td>" + task.assignee + "</td>";
533 s += "<td>" + task.milestone_found + "</td>";
534 s += "<td>" + task.milestone_target + "</td>";
535 s += "<td>" + task.bug.iso_date_created + "</td>";
536 s += "<td>";
537 if (task.bug.latest_patch_uploaded != 'None') {
538 s += 'P ';
539 }
540 if (task.bug.linked_branches.length >= 1) {
541 s += 'B ';
542 }
543 s += '</td>';
544 s += "</tr>";
545 tables[task.team] += s;
546 totals[task.team]++;
547 }
548 });
549 });
550
551 $.each(tables, function(team, val) {
552 id = team.replace(/ /g, '_');
553 $("#" + id + " tbody").html(tables[team]);
554 $("#" + id).trigger("update");
555 % if 'show_total_bugs_per_team' in report_options and report_options['show_total_bugs_per_team']:
556 document.getElementById(team + "-total").innerHTML = totals[team];
557 % endif
558 });
559 if (first_time) {
560 first_time = false;
561 sortList = [[3,1], [4,1]];
562 $.each(tables, function(team, val) {
563 id = team.replace(/ /g, '_');
564 $("#" + id).trigger("sorton", [sortList]);
565 });
566 }
567 % if 'show_total_bugs' in report_options and report_options['show_total_bugs']:
568 document.getElementById("bug-total").innerHTML = "Total: " + bug_total;
569 % endif
570 }
571
572 $(document).ready(function(){
573 // Expand Panel
574 $("#open").click(function(){ $("div#panel").slideDown("slow"); });
575
576 // Collapse Panel
577 $("#close").click(function(){ $("div#panel").slideUp("slow"); });
578
579 // Switch buttons on the tab from "Options" to "Close"
580 $("#toggle a").click(function () { $("#toggle a").toggle(); });
581
582 series_handler(null, null, false);
583 importance_handler(null, null, false);
584 status_handler(null, null, false);
585 /*
586 assignee_handler(null, null, false);
587 date_handler(null, null, false);
588 */
589 update_tables();
590 });
591 </script>
592
593</html>
594<!-- vi:set ts=4 sw=4 expandtab syntax=mako: -->

Subscribers

People subscribed via source and target branches

to all changes: