summaryrefslogtreecommitdiffstats
path: root/extensions/ProductDashboard/template/en/default/pages/productdashboard
diff options
context:
space:
mode:
authorDave Lawrence <dlawrence@mozilla.com>2012-08-07 20:32:38 +0200
committerDave Lawrence <dlawrence@mozilla.com>2012-08-07 20:32:38 +0200
commitcb14de16717a12c32632d15a95e34b36edb7d178 (patch)
treecbd0300bc3cb30c483e9d73ab9d8b1c0c99ca7b7 /extensions/ProductDashboard/template/en/default/pages/productdashboard
parentb037f9bf0993f519375f6dfa0c514529d48b7f23 (diff)
downloadbugzilla-cb14de16717a12c32632d15a95e34b36edb7d178.tar.gz
bugzilla-cb14de16717a12c32632d15a95e34b36edb7d178.tar.xz
Initial checkin of Product Dashboard
Diffstat (limited to 'extensions/ProductDashboard/template/en/default/pages/productdashboard')
-rw-r--r--extensions/ProductDashboard/template/en/default/pages/productdashboard/components.html.tmpl259
-rw-r--r--extensions/ProductDashboard/template/en/default/pages/productdashboard/duplicates.html.tmpl73
-rw-r--r--extensions/ProductDashboard/template/en/default/pages/productdashboard/popularity.html.tmpl73
-rw-r--r--extensions/ProductDashboard/template/en/default/pages/productdashboard/recents.html.tmpl132
-rw-r--r--extensions/ProductDashboard/template/en/default/pages/productdashboard/roadmap.html.tmpl54
-rw-r--r--extensions/ProductDashboard/template/en/default/pages/productdashboard/summary.html.tmpl205
6 files changed, 796 insertions, 0 deletions
diff --git a/extensions/ProductDashboard/template/en/default/pages/productdashboard/components.html.tmpl b/extensions/ProductDashboard/template/en/default/pages/productdashboard/components.html.tmpl
new file mode 100644
index 000000000..7f5a05568
--- /dev/null
+++ b/extensions/ProductDashboard/template/en/default/pages/productdashboard/components.html.tmpl
@@ -0,0 +1,259 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+
+[% IF summary.keys %]
+
+ <h3>Summary for [% summary.type FILTER html %]: [% summary.value FILTER html %]</h3>
+
+ <style>
+ .yui-skin-sam .yui-dt table {width:100%;}
+ </style>
+
+ <script type="text/javascript">
+ <!--
+ var column_defs = [
+ { key:"id", label:"ID", sortable:true, sortOptions:{ sortFunction:sortBugIdLinks } },
+ { key:"bug_status", label:"Status", sortable:true },
+ { key:"version", label:"Version", sortable:true },
+ { key:"component", label:"Component", sortable:true },
+ { key:"bug_severity", label:"Severity", sortable:true, sortOptions:{ sortFunction:sortBugSeverity } },
+ { key:"Summary", label:"Summary", sortable:false },
+ ];
+ var fields = [
+ { key:"id" },
+ { key:"bug_status" },
+ { key:"version" },
+ { key:"component" },
+ { key:"bug_severity" },
+ { key:"Summary" }
+ ];
+ [% IF user.is_timetracker %]
+ addStatListener("past_due", "past_due_table", column_defs, fields, {
+ [% IF summary.past_due.size > 25 %] paginator: new YAHOO.widget.Paginator({ rowsPerPage: 25 }) [% END %]
+ });
+ [% END %]
+ addStatListener("updated_recently", "updated_recently_table", column_defs, fields, {
+ [% IF summary.updated_recently.size > 25 %] paginator: new YAHOO.widget.Paginator({ rowsPerPage: 25 }) [% END %]
+ });
+ -->
+ </script>
+
+ [% IF user.is_timetracker %]
+ <p>
+ <a href="#past_due">Past Due</a> |
+ <a href="#updated_recently">Updated Recently</a>
+ </p>
+ [% END %]
+
+ <div class="yui-skin-sam">
+
+ [% IF user.is_timetracker %]
+ <a name="past_due"></a>
+ <b>[% summary.past_due.size FILTER html %] Past Due [% terms.Bugs %]</b> (deadline is before today's date)
+ (<a href="[% bug_link FILTER html %]&amp;[% summary.type FILTER uri %]=[% summary.value FILTER uri %]&field0-0-0=deadline&type0-0-0=lessthan&value0-0-0=[% summary.timestamp FILTER uri %]&order=deadline">full list</a>)
+ <div id="past_due">
+ <table id="past_due_table" cellspacing="3" cellpadding="0" border="0" width="100%">
+ <thead>
+ <tr bgcolor="#CCCCCC">
+ [% FOREACH column = [ "ID", "Status", "Version", "Component", "Severity" "Summary" ] %]
+ <th>[% column FILTER html %]</th>
+ [% END %]
+ </tr>
+ </thead>
+ <tbody>
+ [% FOREACH bug = summary.past_due %]
+ [% count = loop.count() %]
+ <tr class="[%+ count % 2 == 1 ? "bz_row_odd" : "bz_row_even" -%]">
+ <td align="center"><a href="[% urlbase FILTER none %]show_bug.cgi?id=[% bug.id FILTER uri %]">
+ [% bug.id FILTER html %]</a></td>
+ <td align="center">[% bug.status FILTER html %]</td>
+ <td align="center">[% bug.version FILTER html %]</td>
+ <td align="center">[% bug.component FILTER html %]</td>
+ <td align="center">[% bug.severity FILTER html %]</td>
+ <td>[% bug.summary FILTER html %]</td>
+ </tr>
+ [% END %]
+ </tbody>
+ </table>
+ </div>
+ <br>
+ [% END %]
+
+ <a name="updated_recently"></a>
+ <b>[% summary.updated_recently.size FILTER html %] Most Recently Updated [% terms.Bugs %]</b>
+ [% IF user.is_timetracker %](<a href="#top">back to top</a>)[% END %]
+ (<a href="[% bug_link FILTER html %]&amp;[% summary.type FILTER uri %]=[% summary.value FILTER uri %]&order=changeddate DESC">full list</a>)
+ <div id="updated_recently">
+ <table id="updated_recently_table" cellspacing="3" cellpadding="0" border="0" width="100%">
+ <thead>
+ <tr bgcolor="#CCCCCC">
+ [% FOREACH column = [ "ID", "Status", "Version", "Component", "Severity" "Summary" ] %]
+ <th>[% column FILTER html %]</th>
+ [% END %]
+ </tr>
+ </thead>
+ <tbody>
+ [% FOREACH bug = summary.updated_recently %]
+ [% count = loop.count() %]
+ <tr class="[%+ count % 2 == 1 ? "bz_row_odd" : "bz_row_even" -%]">
+ <td align="center"><a href="[% urlbase FILTER none %]show_bug.cgi?id=[% bug.id FILTER uri %]">
+ [% bug.id FILTER html %]</a></td>
+ <td align="center">[% bug.status FILTER html %]</td>
+ <td align="center">[% bug.version FILTER html %]</td>
+ <td align="center">[% bug.component FILTER html %]</td>
+ <td align="center">[% bug.severity FILTER html %]</td>
+ <td>[% bug.summary FILTER html %]</td>
+ </tr>
+ [% END %]
+ </tbody>
+ </table>
+ </div>
+ </div>
+
+[% ELSE %]
+
+ [% summary_url = "page.cgi?id=productdashboard.html&amp;product=$url_filtered_product&bug_status=$url_filtered_status&tab=components" %]
+
+ <script type="text/javascript">
+ <!--
+ var column_defs = [
+ { key:"name", label:"Name", sortable:true },
+ { key:"count", label:"Count", sortable:true },
+ { key:"percentage", label:"Percentage", sortable:false },
+ { key:"bug_list", label:"[% terms.Bug %] List", sortable:false }
+ ];
+ var fields = [
+ { key:"name" },
+ { key:"count", parser:"number" },
+ { key:"percentage" },
+ { key:"bug_list" }
+ ];
+ addStatListener("component_counts", "component_counts_table", column_defs, fields, {});
+ addStatListener("version_counts", "version_counts_table", column_defs, fields, {});
+ addStatListener("milestone_counts", "milestone_counts_table", column_defs, fields, {});
+ -->
+ </script>
+
+ <p>
+ <a href="#component">Component</a> |
+ <a href="#version">Version</a> |
+ <a href="#milestone">Milestone</a>
+ </p>
+
+ <p>Click on value to show additional information</p>
+
+ <div class="yui-skin-sam">
+ <a name="component"></a>
+ <b>Component</b>
+ <div id="component_counts">
+ <table id="component_counts_table" border="0" cellspacing="3" cellpadding="0">
+ <thead>
+ <tr>
+ <th>Name</th>
+ <th>Count</th>
+ <th>Percentage</th>
+ <th>[% terms.Bug %] List</th>
+ </tr>
+ </thead>
+ <tbody>
+ [% FOREACH col = by_component %]
+ <tr>
+ <td>
+ <a href="[% summary_url FILTER none %]&component=[% col.0 FILTER uri %]">
+ [% col.0 FILTER html %]</a>
+ </td>
+ <td align="right">
+ [% col.1 FILTER html %]
+ </td>
+ <td width="70%">
+ [% INCLUDE bar_graph count = col.1 %]
+ </td>
+ <td>
+ <a href="[% bug_link FILTER html %]&amp;component=[% col.0 FILTER uri %]">View</a>
+ </td>
+ </tr>
+ [% END %]
+ </tbody>
+ </table>
+ </div>
+ <br>
+ <a name="version"></a>
+ <b>Version</b>
+ (<a href="#top">back to top</a>)
+ <div id="version_counts">
+ <table id="version_counts_table" border="0" cellspacing="3" cellpadding="0">
+ <thead>
+ <tr>
+ <th>Name</th>
+ <th>Count</th>
+ <th>Percentage</th>
+ <th>[% terms.Bug %] List</th>
+ </tr>
+ </thead>
+ <tbody>
+ [% FOREACH col = by_version %]
+ <tr>
+ <td>
+ <a href="[% summary_url FILTER none %]&version=[% col.0 FILTER uri %]">
+ [% col.0 FILTER html %]</a>
+ </td>
+ <td align="right">
+ [% col.1 FILTER html %]
+ </td>
+ <td width="70%">
+ [% INCLUDE bar_graph count = col.1 %]
+ </td>
+ <td>
+ <a href="[% bug_link FILTER html %]&amp;version=[% col.0 FILTER uri %]">View</a>
+ </td>
+ </tr>
+ [% END %]
+ </tbody>
+ </table>
+ </div>
+
+ [% IF Param('usetargetmilestone') %]
+ <br>
+ <a name="milestone"></a>
+ <b>Milestone</b>
+ (<a href="#top">back to top</a>)
+ <div id="milestone_counts">
+ <table id="milestone_counts_table" border="0" cellspacing="3" cellpadding="0">
+ <thead>
+ <tr>
+ <th>Name</th>
+ <th>Count</th>
+ <th>Percentage</th>
+ <th>[% terms.Bug %] List</th>
+ </tr>
+ </thead>
+ <tbody>
+ [% FOREACH col = by_milestone %]
+ <tr>
+ <td>
+ <a href="[% summary_url FILTER none %]&target_milestone=[% col.0 FILTER uri %]">
+ [% col.0 FILTER html %]</a>
+ </td>
+ <td align="right">
+ [% col.1 FILTER html %]
+ </td>
+ <td width="70%">
+ [% INCLUDE bar_graph count = col.1 %]
+ </td>
+ <td>
+ <a href="[% bug_link FILTER html %]&amp;target_milestone=[% col.0 FILTER uri %]">View</a>
+ </td>
+ </tr>
+ [% END %]
+ </tbody>
+ </table>
+ </div>
+ [% END %]
+ </div>
+
+[% END %]
diff --git a/extensions/ProductDashboard/template/en/default/pages/productdashboard/duplicates.html.tmpl b/extensions/ProductDashboard/template/en/default/pages/productdashboard/duplicates.html.tmpl
new file mode 100644
index 000000000..36a820300
--- /dev/null
+++ b/extensions/ProductDashboard/template/en/default/pages/productdashboard/duplicates.html.tmpl
@@ -0,0 +1,73 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+
+<style>
+ .yui-skin-sam .yui-dt table {width:100%;}
+</style>
+
+<script type="text/javascript">
+<!--
+var column_defs = [
+ { key:"id", label:"ID", sortable:true, sortOptions:{ sortFunction:sortBugIdLinks } },
+ { key:"count", label:"Count", sortable:true },
+ { key:"bug_status", label:"Status", sortable:true },
+ { key:"version", label:"Version", sortable:true },
+ { key:"component", label:"Component", sortable:true },
+ { key:"bug_severity", label:"Severity", sortable:true, sortOptions:{ sortFunction:sortBugSeverity } },
+ { key:"Summary", label:"Summary", sortable:false },
+];
+var fields = [
+ { key:"id" },
+ { key:"count", parser:"number" },
+ { key:"bug_status" },
+ { key:"version" },
+ { key:"component" },
+ { key:"bug_severity" },
+ { key:"Summary" }
+];
+addStatListener("duplicate_counts", "duplicate_counts_table", column_defs, fields, {
+ [% IF by_duplicate.size > 25 %] paginator: new YAHOO.widget.Paginator({ rowsPerPage: 25 }) [% END %]
+});
+-->
+</script>
+
+[% IF by_duplicate.size %]
+ <b>[% by_duplicate.size FILTER html %]&nbsp;[% terms.Bugs %] Found</b>
+ <div class="yui-skin-sam">
+ <div id="duplicate_counts">
+ <table id="duplicate_counts_table" cellspacing="3" cellpadding="0" border="0" width="100%">
+ <thead>
+ <tr bgcolor="#CCCCCC">
+ [% FOREACH column = [ "ID", "Dupe Count", "Status", "Version"
+ "Component", "Severity" "Summary" ] %]
+
+ <th>[% column FILTER html %]</th>
+ [% END %]
+ </tr>
+ </thead>
+ <tbody>
+ [% FOREACH bug = by_duplicate %]
+ [% count = loop.count() %]
+ <tr class="[%+ count % 2 == 1 ? "bz_row_odd" : "bz_row_even" -%]">
+ <td align="center"><a href="[% urlbase FILTER none %]show_bug.cgi?id=[% bug.id FILTER uri %]">
+ [% bug.id FILTER html %]</a></td>
+ <td align="center">[% bug.dupe_count FILTER html %]</td>
+ <td align="center">[% bug.status FILTER html %]</td>
+ <td align="center">[% bug.version FILTER html %]</td>
+ <td align="center">[% bug.component FILTER html %]</td>
+ <td align="center">[% bug.severity FILTER html %]</td>
+ <td>[% bug.summary FILTER html %]</td>
+ </tr>
+ [% END %]
+ </tbody>
+ </table>
+ </div>
+ </div>
+[% ELSE %]
+ <h3>No duplicate [% terms.bugs %] found.</h3>
+[% END %]
diff --git a/extensions/ProductDashboard/template/en/default/pages/productdashboard/popularity.html.tmpl b/extensions/ProductDashboard/template/en/default/pages/productdashboard/popularity.html.tmpl
new file mode 100644
index 000000000..9c7c42563
--- /dev/null
+++ b/extensions/ProductDashboard/template/en/default/pages/productdashboard/popularity.html.tmpl
@@ -0,0 +1,73 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+
+<style>
+ .yui-skin-sam .yui-dt table {width:100%;}
+</style>
+
+<script type="text/javascript">
+<!--
+var column_defs = [
+ { key:"id", label:"ID", sortable:true, sortOptions:{ sortFunction:sortBugIdLinks } },
+ { key:"count", label:"Count", sortable:true },
+ { key:"bug_status", label:"Status", sortable:true },
+ { key:"version", label:"Version", sortable:true },
+ { key:"component", label:"Component", sortable:true },
+ { key:"bug_severity", label:"Severity", sortable:true, sortOptions:{ sortFunction:sortBugSeverity } },
+ { key:"Summary", label:"Summary", sortable:false },
+];
+var fields = [
+ { key:"id" },
+ { key:"count", parser:"number" },
+ { key:"bug_status" },
+ { key:"version" },
+ { key:"component" },
+ { key:"bug_severity" },
+ { key:"Summary" }
+];
+addStatListener("popularity_counts", "popularity_counts_table", column_defs, fields, {
+ [% IF by_popularity.size > 25 %] paginator: new YAHOO.widget.Paginator({ rowsPerPage: 25 }) [% END %]
+});
+-->
+</script>
+
+[% IF by_popularity.size %]
+ <b>[% by_popularity.size FILTER html %]&nbsp;[% terms.Bugs %] Found</b>
+ <div class="yui-skin-sam">
+ <div id="popularity_counts">
+ <table id="popularity_counts_table" cellspacing="3" cellpadding="0" border="0" width="100%">
+ <thead>
+ <tr bgcolor="#CCCCCC">
+ [% FOREACH column = [ "ID", "Count", "Status", "Version"
+ "Component", "Severity" "Summary" ] %]
+
+ <th>[% column FILTER html %]</th>
+ [% END %]
+ </tr>
+ </thead>
+ <tbody>
+ [% FOREACH bug = by_popularity %]
+ [% count = loop.count() %]
+ <tr class="[%+ count % 2 == 1 ? "bz_row_odd" : "bz_row_even" -%]">
+ <td align="center"><a href="[% urlbase FILTER none %]show_bug.cgi?id=[% bug.id FILTER uri %]">
+ [% bug.id FILTER html %]</a></td>
+ <td align="center">[% bug.votes FILTER html %]</td>
+ <td align="center">[% bug.status FILTER html %]</td>
+ <td align="center">[% bug.version FILTER html %]</td>
+ <td align="center">[% bug.component FILTER html %]</td>
+ <td align="center">[% bug.severity FILTER html %]</td>
+ <td>[% bug.summary FILTER html %]</td>
+ </tr>
+ [% END %]
+ </tbody>
+ </table>
+ </div>
+ </div>
+[% ELSE %]
+ <h3>No [% terms.bugs %] found.</h3>
+[% END %]
diff --git a/extensions/ProductDashboard/template/en/default/pages/productdashboard/recents.html.tmpl b/extensions/ProductDashboard/template/en/default/pages/productdashboard/recents.html.tmpl
new file mode 100644
index 000000000..4350e7472
--- /dev/null
+++ b/extensions/ProductDashboard/template/en/default/pages/productdashboard/recents.html.tmpl
@@ -0,0 +1,132 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+
+<style>
+ .yui-skin-sam .yui-dt table {width:100%;}
+</style>
+
+<script type="text/javascript">
+<!--
+var column_defs = [
+ { key:"id", label:"ID", sortable:true, sortOptions:{ sortFunction:sortBugIdLinks } },
+ { key:"bug_status", label:"Status", sortable:true },
+ { key:"version", label:"Version", sortable:true },
+ { key:"component", label:"Component", sortable:true },
+ { key:"bug_severity", label:"Severity", sortable:true, sortOptions:{ sortFunction:sortBugSeverity } },
+ { key:"Summary", label:"Summary", sortable:false },
+];
+var fields = [
+ { key:"id" },
+ { key:"bug_status" },
+ { key:"version" },
+ { key:"component" },
+ { key:"bug_severity" },
+ { key:"Summary" }
+];
+addStatListener("recently_opened", "recently_opened_table", column_defs, fields, {
+ [% IF recently_opened.size > 25 %] paginator: new YAHOO.widget.Paginator({ rowsPerPage: 25 }) [% END %]
+});
+addStatListener("recently_closed", "recently_closed_table", column_defs, fields, {
+ [% IF recently_closed.size > 25 %] paginator: new YAHOO.widget.Paginator({ rowsPerPage: 25 }) [% END %]
+});
+-->
+</script>
+
+<p>
+ Activity within the last <input type="text" size="4" name="recent_days"
+ value="[% recent_days FILTER html %]">
+ days (between 1 and 100) or from
+ <input name="date_from" size="10" id="date_from"
+ value="[% date_from FILTER html %]"
+ onchange="updateCalendarFromField(this)">
+ <button type="button" class="calendar_button"
+ id="button_calendar_date_from"
+ onclick="showCalendar('date_from')">
+ <span>Calendar</span>
+ </button>
+ <span id="con_calendar_date_from"></span>
+ to
+ <input name="date_to" size="10" id="date_to"
+ value="[% date_to FILTER html %]"
+ onchange="updateCalendarFromField(this)">
+ <button type="button" class="calendar_button"
+ id="button_calendar_date_to"
+ onclick="showCalendar('date_to')">
+ <span>Calendar</span>
+ </button>
+ <span id="con_calendar_date_to"></span>
+ <script type="text/javascript">
+ createCalendar('date_from')
+ createCalendar('date_to')
+ </script>
+ <input type="submit" name="change" value="Change">
+</p>
+<p>
+ <a href="#recently_opened">Recently Opened</a>
+ <span class="separator"> | </span>
+ <a href="#recently_closed">Recently Closed</a>
+</p>
+
+<div class="yui-skin-sam">
+ <a name="recently_opened"></a>
+ <b>[% recently_opened.size FILTER html %] Recently Opened [% terms.Bugs %]</b>
+ <div id="recently_opened">
+ <table id="recently_opened_table" cellspacing="3" cellpadding="0" border="0" width="100%">
+ <thead>
+ <tr bgcolor="#CCCCCC">
+ [% FOREACH column = [ "ID", "Status", "Version", "Component", "Severity" "Summary" ] %]
+ <th>[% column FILTER html %]</th>
+ [% END %]
+ </tr>
+ </thead>
+ <tbody>
+ [% FOREACH bug = recently_opened %]
+ [% count = loop.count() %]
+ <tr class="[%+ count % 2 == 1 ? "bz_row_odd" : "bz_row_even" -%]">
+ <td align="center"><a href="[% urlbase FILTER none %]show_bug.cgi?id=[% bug.id FILTER uri %]">
+ [% bug.id FILTER html %]</a></td>
+ <td align="center">[% bug.status FILTER html %]</td>
+ <td align="center">[% bug.version FILTER html %]</td>
+ <td align="center">[% bug.component FILTER html %]</td>
+ <td align="center">[% bug.severity FILTER html %]</td>
+ <td>[% bug.summary FILTER html %]</td>
+ </tr>
+ [% END %]
+ </tbody>
+ </table>
+ </div>
+ <br>
+ <a name="recently_closed"></a>
+ <b>[% recently_closed.size FILTER html %] Recently Closed [% terms.Bugs %]</b>
+ (<a href="#top">back to top</a>)
+ <div id="recently_closed">
+ <table id="recently_closed_table" cellspacing="3" cellpadding="0" border="0" width="100%">
+ <thead>
+ <tr bgcolor="#CCCCCC">
+ [% FOREACH column = [ "ID", "Status", "Version", "Component", "Severity" "Summary" ] %]
+ <th>[% column FILTER html %]</th>
+ [% END %]
+ </tr>
+ </thead>
+ <tbody>
+ [% FOREACH bug = recently_closed %]
+ [% count = loop.count() %]
+ <tr class="[%+ count % 2 == 1 ? "bz_row_odd" : "bz_row_even" -%]">
+ <td align="center"><a href="[% urlbase FILTER none %]show_bug.cgi?id=[% bug.id FILTER uri %]">
+ [% bug.id FILTER html %]</a></td>
+ <td align="center">[% bug.status FILTER html %]</td>
+ <td align="center">[% bug.version FILTER html %]</td>
+ <td align="center">[% bug.component FILTER html %]</td>
+ <td align="center">[% bug.severity FILTER html %]</td>
+ <td>[% bug.summary FILTER html %]</td>
+ </tr>
+ [% END %]
+ </tbody>
+ </table>
+ </div>
+</div>
diff --git a/extensions/ProductDashboard/template/en/default/pages/productdashboard/roadmap.html.tmpl b/extensions/ProductDashboard/template/en/default/pages/productdashboard/roadmap.html.tmpl
new file mode 100644
index 000000000..fad1cafa5
--- /dev/null
+++ b/extensions/ProductDashboard/template/en/default/pages/productdashboard/roadmap.html.tmpl
@@ -0,0 +1,54 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+
+<script type="text/javascript">
+<!--
+var column_defs = [
+ { key:"milestone", label:"Milestone", sortable:true },
+ { key:"percentage complete", label:"Percentage Complete", sortable:false },
+ { key:"links", label:"Links", sortable:false },
+];
+var fields = [
+ { key:"milestone" },
+ { key:"percentage complete" },
+ { key:"links" }
+];
+
+addStatListener("bug_milestones", "bug_milestones_table", column_defs, fields, {});
+-->
+</script>
+
+<div class="yui-skin-sam">
+<div id="bug_milestones">
+ <table id="bug_milestones_table" border="0" cellspacing="3" cellpadding="0">
+ <thead>
+ <tr>
+ <th>Milestone</th>
+ <th>Percentage Complete</th>
+ <th>Links</th>
+ </tr>
+ </thead>
+ <tbody>
+ [% FOREACH milestone = by_roadmap %]
+ <tr>
+ <td>[% milestone.name FILTER html %]</td>
+ <td width="70%">
+ [% INCLUDE bar_graph count = milestone.closed_bugs full_bug_count = milestone.total_bugs %]
+ </td>
+ <td>
+ <a href="[% milestone.link_closed FILTER html %]">
+ [% milestone.closed_bugs FILTER html %]</a>&nbsp;of&nbsp;
+ <a href="[% milestone.link_total FILTER html %]">
+ [% milestone.total_bugs FILTER html %]</a>&nbsp;bugs have been closed
+ </td>
+ </tr>
+ [% END %]
+ </tbody>
+ </table>
+ </div>
+</div>
diff --git a/extensions/ProductDashboard/template/en/default/pages/productdashboard/summary.html.tmpl b/extensions/ProductDashboard/template/en/default/pages/productdashboard/summary.html.tmpl
new file mode 100644
index 000000000..c1b0a8854
--- /dev/null
+++ b/extensions/ProductDashboard/template/en/default/pages/productdashboard/summary.html.tmpl
@@ -0,0 +1,205 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+
+<script type="text/javascript">
+<!--
+var column_defs = [
+ { key:"name", label:"Name", sortable:true },
+ { key:"count", label:"Count", sortable:true },
+ { key:"percentage", label:"Percentage", sortable:false }
+];
+var fields = [
+ { key:"name" },
+ { key:"count", parser:"number" },
+ { key:"percentage" }
+];
+addStatListener("bug_counts", "bug_counts_table", column_defs, fields, {});
+addStatListener("status_counts", "status_counts_table", column_defs, fields, {});
+addStatListener("priority_counts", "priority_counts_table", column_defs, fields, {});
+addStatListener("severity_counts", "severity_counts_table", column_defs, fields, {});
+addStatListener("assignee_counts", "assignee_counts_table", column_defs, fields, {});
+-->
+</script>
+
+<p>
+ <a href="#counts">Counts</a>
+ <span class="separator"> | </span>
+ <a href="#status">Status</a>
+ <span class="separator"> | </span>
+ <a href="#priority">Priority</a>
+ <span class="separator"> | </span>
+ <a href="#severity">Severity</a>
+ <span class="separator"> | </span>
+ <a href="#assignee">Assignee</a>
+</p>
+
+<div class="yui-skin-sam">
+ <a name="counts"></a>
+ <b>[% terms.Bug %] Counts</b>
+ <div id="bug_counts">
+ <table id="bug_counts_table" border="0" cellspacing="3" cellpadding="0">
+ <thead>
+ <tr>
+ <th>Name</th>
+ <th>Count</th>
+ <th>Percentage</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td><a href="[% bug_link_all FILTER html %]">Total [% terms.Bugs %]</a></td>
+ <td>[% total_bugs FILTER html %]</td>
+ <td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td><a href="[% bug_link_open FILTER html %]">Open [% terms.Bugs %]</a></td>
+ <td>[% total_open_bugs FILTER html %]</td>
+ <td width="70%">
+ [% INCLUDE bar_graph count = total_open_bugs full_bug_count = total_bugs %]
+ </td>
+ </tr>
+ <tr>
+ <td><a href="[% bug_link_closed FILTER html %]">Closed [% terms.Bugs %]</a></td>
+ <td>[% total_closed_bugs FILTER html %]</td>
+ <td width="70%">
+ [% INCLUDE bar_graph count = total_closed_bugs full_bug_count = total_bugs %]
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ <br>
+ <a name="status"></a>
+ <b>Status</b>
+ (<a href="#top">back to top</a>)
+ <div id="status_counts">
+ <table id="status_counts_table" border="0" cellspacing="3" cellpadding="0">
+ <thead>
+ <tr>
+ <th>Name</th>
+ <th>Count</th>
+ <th>Percentage</th>
+ </tr>
+ </thead>
+ <tbody>
+ [% FOREACH col = by_status %]
+ [% NEXT IF col.0 == 'CLOSED' %]
+ <tr>
+ <td>
+ <a href="[% bug_link_all FILTER html %]&amp;bug_status=[% col.0 FILTER uri %]">
+ [% col.0 FILTER html %]</a>
+ </td>
+ <td>
+ [% col.1 FILTER html %]
+ </td>
+ <td width="70%">
+ [% INCLUDE bar_graph count = col.1 %]
+ </td>
+ </tr>
+ [% END %]
+ </tbody>
+ </table>
+ </div>
+ <br>
+ <a name="priority"></a>
+ <b>Priority</b>
+ (<a href="#top">back to top</a>)
+ <div id="priority_counts">
+ <table id="priority_counts_table" border="0" cellspacing="3" cellpadding="0">
+ <thead>
+ <tr>
+ <th>Name</th>
+ <th>Count</th>
+ <th>Percentage</th>
+ </tr>
+ </thead>
+ </tbody>
+ [% FOREACH col = by_priority %]
+ <tr>
+ <td>
+ <a href="[% bug_link FILTER html %]&amp;priority=[% col.0 FILTER uri %]">
+ [% col.0 FILTER html %]</a>
+ </td>
+ <td>
+ [% col.1 FILTER html %]
+ </td>
+ <td width="70%">
+ [% INCLUDE bar_graph count = col.1 %]
+ </td>
+ </tr>
+ [% END %]
+ </tbody>
+ </table>
+ </div>
+ <br>
+ <a name="severity"></a>
+ <b>Severity</b>
+ (<a href="#top">back to top</a>)
+ <div id="severity_counts">
+ <table id="severity_counts_table" border="0" cellspacing="3" cellpadding="0">
+ <thead>
+ <tr>
+ <th>Name</th>
+ <th>Count</th>
+ <th>Percentage</th>
+ </tr>
+ </thead>
+ <tbody>
+ [% FOREACH col = by_severity %]
+ <tr>
+ <td>
+ <a href="[% bug_link FILTER html %]&amp;bug_severity=[% col.0 FILTER uri %]">
+ [% col.0 FILTER html %]</a>
+ </td>
+ <td align="right">
+ [% col.1 FILTER html %]
+ </td>
+ <td width="70%">
+ [% INCLUDE bar_graph count = col.1 %]
+ </td>
+ </tr>
+ [% END %]
+ </tbody>
+ </table>
+ </div>
+ <br>
+ <a name="assignee"></a>
+ <b>Assignee</b>
+ (<a href="#top">back to top</a>)
+ <div id="assignee_counts">
+ <table id="assignee_counts_table" border="0" cellspacing="3" cellpadding="0">
+ <thead>
+ <tr>
+ <th>Name</th>
+ <th>Count</th>
+ <th>Percentage</th>
+ </tr>
+ </thead>
+ <tbody>
+ [% FOREACH col = by_assignee %]
+ <tr>
+ <td>
+ [% IF user.id %]
+ <a href="[% bug_link FILTER html %]&amp;emailassigned_to1=1&amp;emailtype1=exact&amp;email1=[% col.0.email FILTER uri %]">
+ [% col.0.email FILTER html %]</a>
+ [% ELSE %]
+ [% col.0.realname || "No Name" FILTER html %]
+ [% END %]
+ </td>
+ <td>
+ [% col.1 FILTER html %]
+ </td>
+ <td width="70%">
+ [% INCLUDE bar_graph count = col.1 %]
+ </td>
+ </tr>
+ [% END %]
+ </tbody>
+ </table>
+ </div>
+</div>