summaryrefslogtreecommitdiffstats
path: root/extensions/ProductDashboard/template/en/default/pages
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
parentb037f9bf0993f519375f6dfa0c514529d48b7f23 (diff)
downloadbugzilla-cb14de16717a12c32632d15a95e34b36edb7d178.tar.gz
bugzilla-cb14de16717a12c32632d15a95e34b36edb7d178.tar.xz
Initial checkin of Product Dashboard
Diffstat (limited to 'extensions/ProductDashboard/template/en/default/pages')
-rw-r--r--extensions/ProductDashboard/template/en/default/pages/productdashboard.html.tmpl209
-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
7 files changed, 1005 insertions, 0 deletions
diff --git a/extensions/ProductDashboard/template/en/default/pages/productdashboard.html.tmpl b/extensions/ProductDashboard/template/en/default/pages/productdashboard.html.tmpl
new file mode 100644
index 000000000..a319060d1
--- /dev/null
+++ b/extensions/ProductDashboard/template/en/default/pages/productdashboard.html.tmpl
@@ -0,0 +1,209 @@
+[%# 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.
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[% filtered_product = product.name FILTER html %]
+[% PROCESS global/header.html.tmpl
+ title = "Product Dashboard: $filtered_product"
+ style_urls = [ "skins/standard/buglist.css",
+ "js/yui/assets/skins/sam/paginator.css",
+ "extensions/ProductDashboard/web/styles/productdashboard.css" ]
+ yui = [ "datatable", "paginator", "calendar" ]
+ javascript_urls = [ "js/util.js", "js/field.js",
+ "extensions/ProductDashboard/web/js/productdashboard.js" ]
+%]
+
+<script type="text/javascript">
+<!--
+ [%# Set up severities list for proper sorting %]
+ var severities = new Array();
+ [% sort_count = 0 %]
+ [% FOREACH s = severities %]
+ severities['[% s FILTER js %]'] = [% sort_count FILTER js %];
+ [% sort_count = sort_count + 1 %]
+ [% END %]
+-->
+</script>
+
+[% url_filtered_product = product.name FILTER uri %]
+[% url_filtered_status = bug_status FILTER uri %]
+
+[% tabs = [
+ {
+ name => "summary",
+ label => "Summary",
+ link => "page.cgi?id=productdashboard.html&amp;product=$url_filtered_product&bug_status=$url_filtered_status&tab=summary"
+ },
+ {
+ name => "recents",
+ label => "Recents",
+ link => "page.cgi?id=productdashboard.html&amp;product=$url_filtered_product&bug_status=$url_filtered_status&tab=recents"
+ },
+ {
+ name => "components",
+ label => "Components/Versions",
+ link => "page.cgi?id=productdashboard.html&amp;product=$url_filtered_product&bug_status=$url_filtered_status&tab=components"
+ },
+ {
+ name => "duplicates",
+ label => "Duplicates",
+ link => "page.cgi?id=productdashboard.html&amp;product=$url_filtered_product&bug_status=$url_filtered_status&tab=duplicates"
+ },
+ {
+ name => "popularity",
+ label => "Popularity",
+ link => "page.cgi?id=productdashboard.html&amp;product=$url_filtered_product&bug_status=$url_filtered_status&tab=popularity"
+ },
+ {
+ name => "roadmap",
+ label => "Road Map",
+ link => "page.cgi?id=productdashboard.html&amp;product=$url_filtered_product&bug_status=$url_filtered_status&tab=roadmap"
+ },
+ ]
+%]
+
+[% FOREACH tab IN tabs %]
+ [% IF tab.name == current_tab_name %]
+ [% current_tab = tab %]
+ [% LAST %]
+ [% END %]
+[% END %]
+
+[% full_bug_count = 0 %]
+[% IF bug_status == 'open' %]
+ [% full_bug_count = total_open_bugs %]
+[% ELSIF bug_status == 'closed' %]
+ [% full_bug_count = total_closed_bugs %]
+[% ELSE %]
+ [% full_bug_count = total_bugs %]
+[% END %]
+
+[% bug_link = bug_link_all %]
+[% IF bug_status == 'open' %]
+ [% bug_link = bug_link_open %]
+[% ELSIF bug_status == 'closed' %]
+ [% bug_link = bug_link_closed %]
+[% END %]
+
+<div class="yui-skin-sam">
+ <a name="top"></a>
+
+ <form action="page.cgi" method="get">
+ <input type="hidden" name="id" value="productdashboard.html">
+ <input type="hidden" name="tab" value="[% current_tab.name FILTER html %]">
+
+ [% IF summary.keys %]
+ <input type="hidden" name="[% summary.type FILTER html %]" value="[% summary.value FILTER html %]">
+ [% END %]
+
+ [% IF product %]
+ <span id="product_dashboard_links">
+ <ul>
+ <li><a href="[% urlbase FILTER none %]enter_bug.cgi?product=[% product.name FILTER uri %]">
+ Create a new [% terms.bug %] in this product</a></li>
+ <li><a href="[% urlbase FILTER none %]describecomponents.cgi?product=[% product.name FILTER uri %]">
+ Show full component descriptions for this product</a></li>
+ </ul>
+ </span>
+ [% END %]
+
+ <h3>Product: [% product.name FILTER html %]</h3>
+ <select name="product">
+ [% FOREACH c = classifications %]
+ <optgroup label="[% c.name FILTER html %]">
+ [% FOREACH p = c.products %]
+ <option value="[% p.name FILTER html %]"
+ [% IF p.name == product.name %]selected="selected"[% END %]>
+ [% p.name FILTER html %]</option>
+ [% END %]</optgroup>
+ [% END %]
+ </select>
+ <select name="bug_status" id="bug_status">
+ [% statuses = [ { name = 'open', label = "Open $terms.Bugs" },
+ { name = 'closed', label = "Closed $terms.Bugs" },
+ { name = 'all', label = "All $terms.Bugs" } ] %]
+ [% FOREACH status = statuses %]
+ <option value="[% status.name FILTER html %]"
+ [% " selected" IF bug_status == "${status.name}" %]>
+ [% status.label FILTER html %]
+ </option>
+ [% END %]
+ </select>
+
+ <input type="submit" value="[% IF product %]Change[% ELSE %]Submit[% END %]">
+
+ [% IF product %]
+
+ <p><i>[% product.description FILTER none %]</i></p>
+
+ [% WRAPPER global/tabs.html.tmpl
+ tabs = tabs
+ current_tab = current_tab
+ %]
+
+ <h3>[% current_tab.label FILTER html %]</h3>
+
+ [% IF current_tab.name == 'summary' %]
+ [% PROCESS pages/productdashboard/summary.html.tmpl %]
+ [% END %]
+
+ [% IF current_tab.name == 'recents' %]
+ [% PROCESS pages/productdashboard/recents.html.tmpl %]
+ [% END %]
+
+ [% IF current_tab.name == 'components' %]
+ [% PROCESS pages/productdashboard/components.html.tmpl %]
+ [% END %]
+
+ [% IF current_tab.name == 'duplicates' %]
+ [% PROCESS pages/productdashboard/duplicates.html.tmpl %]
+ [% END %]
+
+ [% IF current_tab.name == 'popularity' %]
+ [% PROCESS pages/productdashboard/popularity.html.tmpl %]
+ [% END %]
+
+ [% IF current_tab.name == 'roadmap' && Param('usetargetmilestone') %]
+ [% PROCESS pages/productdashboard/roadmap.html.tmpl %]
+ [% END %]
+
+ [% END %][%# END WRAPPER %]
+ [% END %]
+
+ </form>
+</div>
+
+[% PROCESS global/footer.html.tmpl %]
+
+[% BLOCK bar_graph %]
+ [% IF full_bug_count > 0 %][%# No divide by zero %]
+ [% percentage_bugs = (count / full_bug_count) * 100 FILTER format('%02.2f') %]
+ [% ELSE %]
+ [% percentage_bugs = 0 %]
+ [% END %]
+ <div class="bar_graph">
+ <table cellpadding="0" cellspacing="0" width="300px">
+ <tr>
+ <td width="[% percentage_bugs FILTER html %]%">
+ <table cellpadding="0" cellspacing="0" width="100%">
+ <tr>
+ <td bgcolor="#3c78b5">
+ <a title="[% percentage_bugs FILTER html %]%">
+ <img src="extensions/ProductDashboard/web/images/spacer.gif" height=10 width="100%" title="[% percentage_bugs FILTER html %]%">
+ </a>
+ </td>
+ </tr>
+ </table>
+ </td>
+ <td width="[% 100 - percentage_bugs FILTER html %]%">&nbsp;&nbsp;&nbsp;[% percentage_bugs FILTER html %]%</td>
+ </tr>
+ </table>
+ </div>
+[% END %]
+
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>