[%# 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. #%] [%# INTERFACE: # buglistbase: The base query for this table, in URL form # col_field: string. Name of the field being plotted as columns. # row_field: string. Name of the field being plotted as rows. # tbl_field: string. Name of the field being plotted as tables. # col_names: array. List of values for the field being plotted as columns. # row_names: array. List of values for the field being plotted as rows. # data: <depends on format>. Data to plot. Only data.$tbl is accessed. # tbl: Name of a hash in data which is the table to be plotted. #%] [% col_field_disp = field_descs.$col_field || col_field %] [% row_field_disp = field_descs.$row_field || row_field %] [% urlbase = BLOCK %]buglist.cgi?[% buglistbase FILTER html %][% END %] [% IF tbl == "-total-" %] [% IF tbl_vals %] [% urlbase = urlbase _ "&" _ tbl_vals %] [% END %] [% ELSIF tbl_field %] [% urlbase = BLOCK %][% urlbase %]&[% tbl_field FILTER uri %]=[% tbl FILTER uri %][% END %] [% END %] <script type="text/javascript"> function bz_encode (str, decode) { // First decode HTML entities, if requested. if (decode) str = str.replace(/</g, "<").replace(/>/g, ">").replace(/"/g, '"') .replace(/ /g, " ").replace(/&/g, "&").replace(/\s+$/,""); // encodeURIComponent() doesn't escape single quotes. return encodeURIComponent(str).replace(/'/g, escape); }; YAHOO.util.Event.addListener(window, "load", function() { this.Linkify = function(elLiner, oRecord, oColumn, oData) { if (oData == 0) elLiner.innerHTML = "."; else if (oRecord.getData("row_title") == "Total") elLiner.innerHTML = '<a href="[% urlbase FILTER js %]&[% col_field FILTER uri FILTER js %]=' + bz_encode(oColumn.field) + '[% "&" _ row_vals IF row_vals %]">' + oData + '</a>'; else elLiner.innerHTML = '<a href="[% urlbase FILTER js %]&[% row_field FILTER uri FILTER js %]=' + bz_encode(oRecord.getData("row_title"), 1) + '&[% col_field FILTER uri FILTER js %]=' + bz_encode(oColumn.field) + '">' + oData + '</a>'; }; this.LinkifyTotal = function(elLiner, oRecord, oColumn, oData) { if (oData == 0) elLiner.innerHTML = "."; else if (oRecord.getData("row_title") == "Total") elLiner.innerHTML = '<a href="[% urlbase FILTER js %][% "&" _ row_vals IF row_vals %] [%~ "&" _ col_vals IF col_vals %]">' + oData + '</a>'; else elLiner.innerHTML = '<a href="[% urlbase FILTER js %]&[% row_field FILTER uri FILTER js %]=' + bz_encode(oRecord.getData("row_title"), 1) + '[% "&" _ col_vals IF col_vals %]">' + oData + '</a>'; YAHOO.util.Dom.addClass(elLiner.parentNode, "ttotal"); }; var totalRowFormatter = function( elTr, oRecord ) { if ( oRecord.getData('row_title') == "Total" ) { YAHOO.util.Dom.addClass( elTr, 'ttotal' ); } return true; }; var totalNumberSorter = function( a, b, desc, field ){ var a_value = a.getData(field); var b_value = b.getData(field); var a_total_test = a.getData("row_title"); var b_total_test = b.getData("row_title"); var comp_result = YAHOO.util.Sort.compare(a_value, b_value, desc); if( a_total_test == "Total" ){ comp_result = 1; }else if( b_total_test == "Total" ){ comp_result = -1; } return comp_result; }; var myColumnDefs = [ {key:"row_title", label:"", sortable:true, sortOptions: { sortFunction:totalNumberSorter }}, [% FOREACH col = col_names %] {key:"[% col FILTER js %]", label:"[% display_value(col_field, col) FILTER html FILTER js %]", sortable:true, formatter:this.Linkify, sortOptions: { defaultDir: YAHOO.widget.DataTable.CLASS_DESC, sortFunction:totalNumberSorter }}, [% END %] {key:"total", label:"Total", sortable:true, formatter:this.LinkifyTotal, sortOptions: { defaultDir: YAHOO.widget.DataTable.CLASS_DESC, sortFunction:totalNumberSorter }} ]; this.parseString = function(str) { return YAHOO.lang.trim(str); }; this.parseNumber = function(str) { if (str.match(/^\s*\.\s*$/m)) return 0; // Do not use <\/a>$. For some reason, IE6 doesn't understand it. // We use [^\d]+$ instead. var res = str.match(/>(\d+)[^\d]+$/m); if (res && res[1]) return parseFloat(res[1]); }; this.myDataSource = new YAHOO.util.DataSource(YAHOO.util.Dom.get("tabular_report_[% tbl FILTER html FILTER js %]")); this.myDataSource.responseType = YAHOO.util.DataSource.TYPE_HTMLTABLE; this.myDataSource.responseSchema = { fields: [ {key:"row_title", parser:this.parseString}, [% FOREACH col = col_names %] {key:"[% col FILTER js %]", parser:this.parseNumber}, [% END %] {key:"total", parser:this.parseNumber} ] }; this.myDataTable = new YAHOO.widget.DataTable("tabular_report_container_ [% tbl FILTER js %]", myColumnDefs, this.myDataSource, {formatRow: totalRowFormatter}); }); </script> [% IF tbl_field %] <h2>[% tbl_disp FILTER email FILTER html %]</h2> [% END %] <table class="tabular_report_container"> <tr> <td> </td> <td class="center"> <strong>[% col_field_disp FILTER html %]</strong> </td> </tr> <tr> <td class="middle"> <strong>[% row_field_disp FILTER html %]</strong> </td> <td> [% classes = [ [ "t1", "t2" ] , [ "t3", "t4" ] ] %] [% col_idx = 0 %] [% row_idx = 0 %] [% total_key = '-total-' %] <div id="tabular_report_container_[% tbl FILTER html %]"> <table id="tabular_report_[% tbl FILTER html %]" class="tabular_report"> [% IF col_field %] <thead> <tr> <th class="[% classes.$row_idx.$col_idx %]"> </th> [% FOREACH col = col_names %] [% NEXT IF col == "" %] [% col_idx = 1 - col_idx %] <th class="[% classes.$row_idx.$col_idx %]"> [% PROCESS value_display value = col field = col_field %] </th> [% END %] <th class="ttotal"> Total </th> </tr> </thead> [% END %] <tbody> [% FOREACH row = row_names %] [% row_idx = 1 - row_idx %] <tr> <td class="[% classes.$row_idx.$col_idx %] right"> [% PROCESS value_display value = row field = row_field %] </td> [% FOREACH col = col_names %] [% NEXT IF col == "" %] [% col_idx = 1 - col_idx %] <td class="[% classes.$row_idx.$col_idx %]"> [% IF data.$tbl.$col.$row AND data.$tbl.$col.$row > 0 %] <a href="[% urlbase %]& [% row_field FILTER uri %]=[% row FILTER uri %]& [% col_field FILTER uri %]=[% col FILTER uri %]"> [% data.$tbl.$col.$row %]</a> [% ELSE %] . [% END %] </td> [% END %] <td class="ttotal right"> <a href="[% urlbase %]& [% row_field FILTER uri %]=[% row FILTER uri %] [% "&$col_vals" IF col_vals %]"> [% data.$tbl.$total_key.$row OR 0 FILTER html %]</a> </td> </tr> [% END %] <tr> [% row_idx = 1 - row_idx %] <td class="ttotal"> Total </td> [% FOREACH col = col_names %] [% NEXT IF col == "" %] <td class="ttotal"> <a href="[% urlbase %]& [% col_field FILTER uri %]=[% col FILTER uri %] [% "&$row_vals" IF row_vals %]"> [% data.$tbl.$col.$total_key OR 0 FILTER html %]</a> </td> [% END %] <td class="ttotal right"> <strong> <a href="[% urlbase %] [% "&$row_vals" IF row_vals %] [% "&$col_vals" IF col_vals %]">[% data.$tbl.$total_key.$total_key OR 0 FILTER html %]</a> </strong> </td> </tr> </tbody> </table> </div> </td> </tr> </table> [% IF note_multi_select %] <p class="extra_info"> NOTE: Axes contain multi-value fields, so the total numbers might not add up, as a single [% terms.bug %] can match several rows or columns. </p> [% END %] [% BLOCK value_display %] [% SET disp_value = display_value(field, value) %] [% IF field == 'assigned_to' OR field == 'reporter' OR field == 'qa_contact' %] [% disp_value = value FILTER email %] [% END %] [% disp_value FILTER html FILTER replace('^ $',' ') %] [% END %]