--- /dev/null
+<?xml version='1.0'?>
+
+<!DOCTYPE html PUBLIC
+ "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" [
+ <!ENTITY nbsp " ">
+]>
+
+<html xmlns="http://www.w3.org/1999/xhtml" xmlns:xi="http://www.w3.org/2001/XInclude">
+
+ <head>
+ <title>Evergreen: Reports</title>
+ <script language='javascript' src='/opac/common/js/utils.js'> </script>
+ <script language='javascript' src='/opac/common/js//config.js'> </script>
+ <script language='javascript' src='/opac/common/js/CGI.js'> </script>
+ <script language='javascript' src='/opac/common/js/Cookie.js'> </script>
+ <script language='javascript' src='/opac/common/js/JSON.js'> </script>
+ <script language='javascript' src='/opac/common/js/fmall.js'> </script>
+ <script language='javascript' src='/opac/common/js/fmgen.js'> </script>
+ <script language='javascript' src='/opac/common/js/Cookies.js'> </script>
+ <script language='javascript' src='/opac/common/js/opac_utils.js'> </script>
+ <script language='javascript' src='/opac/common/js/OrgTree.js'> </script>
+ <script language='javascript' src='/opac/common/js/org_utils.js'> </script>
+ <script language='javascript' src='/opac/common/js/init.js'> </script>
+ <script language='javascript' src='/opac/common/js/RemoteRequest.js'> </script>
+ <script language='javascript' src='slimtree.js'> </script>
+
+ <link rel="stylesheet" type="text/css" media="all"
+ href="/opac/common/js/jscalendar/calendar-brown.css" title="win2k-cold-1" />
+ <script type="text/javascript" src="/opac/common/js/jscalendar/calendar.js"></script>
+ <script type="text/javascript" src="/opac/common/js/jscalendar/lang/calendar-en.js"></script>
+ <script type="text/javascript" src="/opac/common/js/jscalendar/calendar-setup.js"></script>
+
+ <script type="text/javascript" src="adminlib.js"></script>
+ <script type="text/javascript" src="oils_rpt_vars.js"></script>
+ <script type="text/javascript" src="oils_rpt_utils.js"></script>
+ <script type="text/javascript" src="oils_rpt_builder.js"></script>
+ <script type="text/javascript" src="oils_rpt_tree.js"></script>
+ <script type="text/javascript" src="oils_rpt.js"></script>
+
+ <link rel="stylesheet" type="text/css" href="oils_rpt.css"> </link>
+
+ <script>function _l(l) { location.href = l + location.search; }</script>
+
+ </head>
+
+ <body onload='oilsInitReports();' onunload='oilsCleanupReports();'>
+ <div class='welcome_box'>
+ <span>You are logged in as </span><b><span id='oils_rpt_user'/></b>
+ </div>
+
+ <div>
+ <a class='oils_rpt_main_link' href='javascript:_l("oils_rpt_builder.xhtml");'>Build a New Report</a>
+ </div>
+ </body>
+</html>
+
+
}
function oilsReportBuilderReset() {
+ var n = (oilsRpt) ? oilsRpt.name : "";
oilsRpt = new oilsReport();
+ oilsRpt.name = n;
oilsRptDisplaySelector = DOM.oils_rpt_display_selector;
oilsRptFilterSelector = DOM.oils_rpt_filter_selector;
removeChildren(oilsRptDisplaySelector);
removeChildren(oilsRptFilterSelector);
oilsRptDebug();
+ oilsRptResetParams();
}
/* returns just the column name */
/* adds an item to the display window */
-function oilsAddRptDisplayItem(path, name) {
+function oilsAddRptDisplayItem(path, name, tform) {
if( ! oilsAddSelectorItem(oilsRptDisplaySelector, path, name) )
return;
var param = oilsRptNextParam();
/* add this item to the select blob */
- oilsRpt.def.select.push( {
+ var sel = {
relation:oilsRptPathRel(path),
- column:oilsRptPathCol(path),
alias:param
- });
+ };
+
+ if( tform ) {
+ sel.column = {};
+ sel.column[tform] = oilsRptPathCol(path);
+ } else { sel.column = oilsRptPathCol(path); }
+
+ oilsRpt.def.select.push(sel);
mergeObjects( oilsRpt.def.from, oilsRptBuildFromClause(path));
oilsRpt.params[param] = name;
/* takes a column path and builds a from-clause object for the path */
function oilsRptBuildFromClause(path) {
var parts = path.split(/-/);
- //var obj = {from : {}};
var obj = {};
var tobj = obj;
var newpath = "";
+
for( var i = 0; i < parts.length; i += 2 ) {
var cls = parts[i];
var col = parts[i+1];
function(i) {
for( var j = 0; j < list.length; j++ ) {
var d = list[j];
- if( oilsRptPathRel(d) == i.relation
- && oilsRptPathCol(d) == i.column ) {
+ var col = i.column;
+
+ /* if this columsn has a transform, it will be an object { tform => column } */
+ if( typeof col != 'string' )
+ for( var c in col ) col = col[c];
+
+ if( oilsRptPathRel(d) == i.relation && oilsRptPathCol(d) == col ) {
var param = (i.alias) ? i.alias.match(/::PARAM\d*/) : null;
if( param ) delete oilsRpt.params[param];
return false;
return true;
}
);
- if(!oilsRpt.def.select) oilsRpt.def.select = [];
- for( var j = 0; j < list.length; j++ )
- oilsRptPruneFromClause(list[j]);
+ if(!oilsRpt.def.select) {
+ oilsRpt.def.select = [];
+ oilsReportBuilderReset();
+
+ } else {
+ for( var j = 0; j < list.length; j++ )
+ oilsRptPruneFromClause(list[j]);
+ }
oilsRptDebug();
}
function(){oilsRptHideEditorDivs();unHideMe(DOM.oils_rpt_filter_div)};
DOM.oils_rpt_agg_filter_tab.onclick =
function(){oilsRptHideEditorDivs();unHideMe(DOM.oils_rpt_agg_filter_div)};
+
+ DOM.oils_rpt_tform_tab.onclick();
}
DOM.oils_rpt_tform_label_input.value = oilsRptMakeLabel(path);
DOM.oils_rpt_tform_submit.onclick =
- function(){ oilsAddRptDisplayItem(path, DOM.oils_rpt_tform_label_input.value) };
+ function(){
+ var tform = oilsRptGetTform();
+ tform = (tform == 'raw') ? null : tform;
+ oilsAddRptDisplayItem(path, DOM.oils_rpt_tform_label_input.value, tform)
+ };
DOM.oils_rpt_tform_label_input.focus();
DOM.oils_rpt_tform_label_input.select();
+ oilsRptHideTformFields();
- if( field.datatype == 'timestamp' )
- unHideMe(DOM.oils_rpt_tform_date_div);
+ _debug("Transforming item with datatype "+field.datatype);
+ unHideMe($('oils_rpt_tform_'+field.datatype+'_div'));
+ unHideMe($('oils_rpt_tform_'+field.datatype+'_raw'));
+ $('oils_rpt_tform_'+field.datatype+'_raw').checked = true;
}
+function oilsRptHideTformFields() {
+ for( var t in oilsRptTransforms ) {
+ hideMe($('oils_rpt_tform_'+t+'_div'));
+ for( var i in oilsRptTransforms[t] ) {
+ _debug('oils_rpt_tform_'+t+'_'+oilsRptTransforms[t][i]);
+ $('oils_rpt_tform_'+t+'_'+oilsRptTransforms[t][i]).checked = false;
+ }
+ }
+}
+function oilsRptGetTform() {
+ for( var t in oilsRptTransforms )
+ for( var i in oilsRptTransforms[t] )
+ if( $('oils_rpt_tform_'+t+'_'+oilsRptTransforms[t][i]).checked )
+ return oilsRptTransforms[t][i];
+ return null;
+}
+;
<div style='margin-bottom: 10px;'>Select how this field should be displayed:</div>
<!--#include virtual="oils_rpt_tform_string.xhtml"-->
<!--#include virtual="oils_rpt_tform_date.xhtml"-->
+ <!--#include virtual="oils_rpt_tform_numeric.xhtml"-->
</div>
<br/><br/>
<button id='oils_rpt_tform_submit'>Add Item</button>
--- /dev/null
+<div id='oils_rpt_tform_timestamp_div' class='hide_me'>
+ <input type='radio' name='oils_rpt_tform_timestamp' id='oils_rpt_tform_timestamp_raw'/> Raw Timestamp <br/>
+ <input type='radio' name='oils_rpt_tform_timestamp' id='oils_rpt_tform_timestamp_month_trunc'/> Month Trunc <br/>
+ <input type='radio' name='oils_rpt_tform_timestamp' id='oils_rpt_tform_timestamp_months_ago' /> Months Ago <br/>
+ <input type='radio' name='oils_rpt_tform_timestamp' id='oils_rpt_tform_timestamp_quarters_ago'/> Quarters Ago <br/>
+ <input type='radio' name='oils_rpt_tform_timestamp' id='oils_rpt_tform_timestamp_age'/> Age <br/>
+ <input type='radio' name='oils_rpt_tform_timestamp' id='oils_rpt_tform_timestamp_count'/> Count <br/>
+ <input type='radio' name='oils_rpt_tform_timestamp' id='oils_rpt_tform_timestamp_count_distinct'/> Count Distinct <br/>
+ <input type='radio' name='oils_rpt_tform_timestamp' id='oils_rpt_tform_timestamp_min'/> Min <br/>
+ <input type='radio' name='oils_rpt_tform_timestamp' id='oils_rpt_tform_timestamp_max'/> Max <br/>
+</div>
--- /dev/null
+<div id='oils_rpt_tform_numeric_div'>
+ <input type='radio' name='oils_rpt_tform_numeric' id='oils_rpt_tform_numeric_raw'/> Full Data <br/>
+ <input type='radio' name='oils_rpt_tform_numeric' id='oils_rpt_tform_numeric_sum'/> Full Data <br/>
+ <input type='radio' name='oils_rpt_tform_numeric' id='oils_rpt_tform_numeric_average'/> Full Data <br/>
+ <input type='radio' name='oils_rpt_tform_numeric' id='oils_rpt_tform_numeric_count'/> Count <br/>
+ <input type='radio' name='oils_rpt_tform_numeric' id='oils_rpt_tform_numeric_count_distinct'/> Count Distinct <br/>
+ <input type='radio' name='oils_rpt_tform_numeric' id='oils_rpt_tform_numeric_min'/> Min <br/>
+ <input type='radio' name='oils_rpt_tform_numeric' id='oils_rpt_tform_numeric_max'/> Max <br/>
+</div>
--- /dev/null
+<div id='oils_rpt_tform_string_div'>
+ <input type='radio' name='oils_rpt_tform_string' id='oils_rpt_tform_string_raw'/> Full Data <br/>
+ <input type='radio' name='oils_rpt_tform_string' id='oils_rpt_tform_string_count'/> Count <br/>
+ <input type='radio' name='oils_rpt_tform_string' id='oils_rpt_tform_string_count_distinct'/> Count Distinct <br/>
+ <input type='radio' name='oils_rpt_tform_string' id='oils_rpt_tform_string_min'/> Min <br/>
+ <input type='radio' name='oils_rpt_tform_string' id='oils_rpt_tform_string_max'/> Max <br/>
+ <input type='radio' name='oils_rpt_tform_string' id='oils_rpt_tform_string_substring'/> Substring <br/>
+</div>
return '::PARAM'+ (oilsRptID2++);
}
+function oilsRptResetParams() {
+ oilsRptID2 = 0;
+}
+
function nodeText(id) {
if($(id))
return $(id).innerHTML;
var oilsIDLReportsNS = 'http://open-ils.org/spec/opensrf/IDL/reporter/v1';
var oilsIDLPersistNS = 'http://open-ils.org/spec/opensrf/IDL/persistance/v1';
+
+/* transforms for the different data types */
+var oilsRptTransforms = {
+ 'string' : [ 'substring' ],
+ 'numeric' : [ 'sum', 'average' ],
+ 'timestamp' : [ 'month_trunc', 'months_ago', 'quarters_ago', 'age' ],
+ 'all' : [ 'raw', 'count', 'count_distinct', 'min', 'max' ]
+};
+
+/* for ease of use, shove everything in the 'all' slot into the other tforms */
+for( var t in oilsRptTransforms ) {
+ if( t == 'all' ) continue;
+ for( var a in oilsRptTransforms['all'] )
+ oilsRptTransforms[t].push( oilsRptTransforms['all'][a] );
+}
+delete oilsRptTransforms.all;
+
+
+