From a65c2b2198951a510356ebd810e28bab47ce0385 Mon Sep 17 00:00:00 2001 From: erickson Date: Tue, 26 Sep 2006 14:35:51 +0000 Subject: [PATCH] refactored field transforms and operations to standalone widget classes git-svn-id: svn://svn.open-ils.org/ILS/trunk@6221 dcc99617-32d9-48b4-a31d-7c20da2025e4 --- Open-ILS/web/reports/oils_rpt.css | 8 +- Open-ILS/web/reports/oils_rpt_builder.js | 275 +++++++++++++++++++++- Open-ILS/web/reports/oils_rpt_builder.xhtml | 31 ++- Open-ILS/web/reports/oils_rpt_builder_widgets.js | 109 +++++++++ Open-ILS/web/reports/oils_rpt_ops.xhtml | 74 ++++++ Open-ILS/web/reports/oils_rpt_tform_date.xhtml | 69 ------ Open-ILS/web/reports/oils_rpt_tform_numeric.xhtml | 8 - Open-ILS/web/reports/oils_rpt_tform_string.xhtml | 14 -- Open-ILS/web/reports/oils_rpt_tform_table.xhtml | 39 --- Open-ILS/web/reports/oils_rpt_tforms.xhtml | 54 +++++ Open-ILS/web/reports/oils_rpt_vars.js | 8 + 11 files changed, 541 insertions(+), 148 deletions(-) create mode 100644 Open-ILS/web/reports/oils_rpt_builder_widgets.js create mode 100644 Open-ILS/web/reports/oils_rpt_ops.xhtml delete mode 100644 Open-ILS/web/reports/oils_rpt_tform_date.xhtml delete mode 100644 Open-ILS/web/reports/oils_rpt_tform_numeric.xhtml delete mode 100644 Open-ILS/web/reports/oils_rpt_tform_string.xhtml delete mode 100644 Open-ILS/web/reports/oils_rpt_tform_table.xhtml create mode 100644 Open-ILS/web/reports/oils_rpt_tforms.xhtml diff --git a/Open-ILS/web/reports/oils_rpt.css b/Open-ILS/web/reports/oils_rpt.css index 12fa6c551e..c829463ad7 100644 --- a/Open-ILS/web/reports/oils_rpt.css +++ b/Open-ILS/web/reports/oils_rpt.css @@ -93,7 +93,7 @@ button { .floaty { position: absolute; text-align: center; - z-index: 10; + z-index: 1; background: #E0F0F0; border: 3px groove #0033EE; padding: 10px; @@ -142,3 +142,9 @@ button { border-bottom: 1px solid #A0A0A0; padding: 4px; } + +.oils_rpt_cal_image { + cursor: pointer; + border: 1px solid red; + padding: 0px; margin: -3px; +} diff --git a/Open-ILS/web/reports/oils_rpt_builder.js b/Open-ILS/web/reports/oils_rpt_builder.js index 8e34acfd9e..401e2a60ca 100644 --- a/Open-ILS/web/reports/oils_rpt_builder.js +++ b/Open-ILS/web/reports/oils_rpt_builder.js @@ -6,6 +6,7 @@ function oilsInitReportBuilder() { oilsReportBuilderReset(); DOM.oils_rpt_table.onclick = function(){hideMe(DOM.oils_rpt_column_editor)}; + //oilsRptBuildCalendars(); oilsDrawRptTree( function() { hideMe(DOM.oils_rpt_tree_loading); @@ -26,6 +27,26 @@ function oilsReportBuilderReset() { oilsRptResetParams(); } +/* +function oilsRptBuildCalendars() { + Calendar.setup({ + inputField : "oils_rpt_filter_tform_timestamp_input", // id of the input field + ifFormat : "%Y-%m-%d", // format of the input field + button : "oils_rpt_filter_tform_timestamp_cal", // trigger for the calendar (button ID) + align : "Tl", // alignment (defaults to "Bl") + singleClick : true + }); + Calendar.setup({ + inputField : "oils_rpt_filter_tform_timestamp_input_2", // id of the input field + ifFormat : "%Y-%m-%d", // format of the input field + button : "oils_rpt_filter_tform_timestamp_cal2", // trigger for the calendar (button ID) + align : "Tl", // alignment (defaults to "Bl") + singleClick : true + }); +} +*/ + + /* returns just the column name */ function oilsRptPathCol(path) { @@ -282,9 +303,10 @@ function oilsRptHideEditorDivs() { function oilsRptDrawDataWindow(path) { var col = oilsRptPathCol(path); var cls = oilsRptPathClass(path); - var field = grep(oilsIDL[cls].fields, function(f){return (f.name==col);})[0]; + var field = oilsRptFindField(oilsIDL[cls], col); appendClear(DOM.oils_rpt_editor_window_label, text(oilsRptMakeLabel(path))); + appendClear(DOM.oils_rpt_editor_window_datatype, text(field.datatype)); _debug("setting update data window for column "+col+' on class '+cls); @@ -299,13 +321,24 @@ function oilsRptDrawDataWindow(path) { div.style.visibility='hidden'; oilsRptDrawTransformWindow(path, col, cls, field); + oilsRptDrawFilterWindow(path, col, cls, field); + + //oilsRptSetFilters(field.datatype); + + //oilsRptDoFilterWidgets(); + + //DOM.oils_rpt_filter_tform_selector.onchange = oilsRptDoFilterWidgets; - DOM.oils_rpt_column_editor_close_button.onclick = function(){hideMe(div);}; buildFloatingDiv(div, 600); /* now let them see it */ div.style.visibility='visible'; + oilsRptSetDataWindowActions(div); +} + + +function oilsRptSetDataWindowActions(div) { /* give the tab links behavior */ DOM.oils_rpt_tform_tab.onclick = function(){oilsRptHideEditorDivs();unHideMe(DOM.oils_rpt_tform_div)}; @@ -315,6 +348,14 @@ function oilsRptDrawDataWindow(path) { function(){oilsRptHideEditorDivs();unHideMe(DOM.oils_rpt_agg_filter_div)}; DOM.oils_rpt_tform_tab.onclick(); + DOM.oils_rpt_column_editor_close_button.onclick = function(){hideMe(div);}; +} + + +function oilsRptDrawFilterWindow(path, col, cls, field) { + oilsRptCurrentFilterTform = new oilsRptTFormManager(DOM.oils_rpt_filter_tform_table); + oilsRptCurrentFilterTform.build(field.datatype, false, true); + oilsRptCurrentFilterOpManager = new oilsRptOpManager(DOM.oils_rpt_filter_op_table); } @@ -325,24 +366,39 @@ function oilsRptDrawTransformWindow(path, col, cls, field) { DOM.oils_rpt_tform_submit.onclick = function(){ + /* var tform = oilsRptGetTform(dtype); _debug('found tform: ' + js2JSON(tform)); var params = getRptTformParams(dtype, tform); _debug('found tform params: ' + js2JSON(params)); tform = (tform == 'raw') ? null : tform; - oilsAddRptDisplayItem(path, DOM.oils_rpt_tform_label_input.value, tform, params ) + */ + + var tform = oilsRptCurrentTform.getCurrentTForm(); + oilsAddRptDisplayItem(path, DOM.oils_rpt_tform_label_input.value, tform.value, tform.params ) }; + DOM.oils_rpt_tform_label_input.focus(); DOM.oils_rpt_tform_label_input.select(); + + oilsRptCurrentTform = new oilsRptTFormManager(DOM.oils_rpt_tform_table); + oilsRptCurrentTform.build(dtype, true, true); + + /* oilsRptHideTformFields(); oilsRptUnHideTformFields(dtype); + */ - _debug("Transforming item with datatype "+dtype); + _debug("Building transiform window for datatype "+dtype); + + /* unHideMe($('oils_rpt_tform_'+dtype+'_div')); $('oils_rpt_tform_all_raw').checked = true; + */ } +/* function oilsRptHideTformFields() { var rows = DOM.oils_rpt_tform_tbody.childNodes; for( var i = 0; i < rows.length; i++ ) @@ -362,6 +418,7 @@ function oilsRptUnHideTformFields(dtype) { } } + function oilsRptGetTform(datatype) { for( var i in oilsRptTransforms[datatype] ) if( $('oils_rpt_tform_'+datatype+'_'+oilsRptTransforms[datatype][i]).checked ) @@ -371,16 +428,12 @@ function oilsRptGetTform(datatype) { return oilsRptTransforms.all[i]; return null; } +*/ + +/* function getRptTformParams(type, tform) { switch(type) { - case 'timestamp': - switch(tform) { - case 'months_ago': - return [DOM.oils_rpt_tform_timestamp_months_ago_input.value]; - case 'quarters_ago': - return [DOM.oils_rpt_tform_timestamp_quarters_ago_input.value]; - } case 'string' : switch(tform) { case 'substring' : @@ -390,5 +443,205 @@ function getRptTformParams(type, tform) { } } } +*/ + + +/* given a transform selector, this displays the appropriate + transforms for the given datatype. + if aggregate is true, is displays the aggregate transforms */ +/* +function oilsRptSetTransforms(sel, dtype, show_agg, show_noagg) { + for( var i = 0; i < sel.options.length; i++ ) { + var opt = sel.options[i]; + var t = opt.getAttribute('datatype'); + if( t && t != dtype ){ + hideMe(opt); + } else { + var ag = opt.getAttribute('aggregate'); + if( ag && show_agg ) + unHideMe(opt); + else if( ag && ! show_agg ) + hideMe(opt) + else if( !ag && show_noagg ) + unHideMe(opt); + else + hideMe(opt); + } + } +} +*/ + + +/* displays the correct filter-transforms for the given datatype */ +/* +function oilsRptSetFilters(dtype) { + + DOM.oils_rpt_filter_submit.onclick = function() { + var data = oilsRptDoFilterWidgets(); + alert(js2JSON(data)); + } + + var sel = DOM.oils_rpt_filter_tform_selector; + for( var i = 0; i < sel.options.length; i++ ) { + var opt = sel.options[i]; + _debug(opt.getAttribute('op')); + var t = opt.getAttribute('datatype'); + if( t && t != dtype ) hideMe(opt); + else unHideMe(opt); + } +} +*/ + +/* hides all of the filter widgets */ +function oilsRptHideFilterWidgets(node) { + if(!node) + node = DOM.oils_rpt_filter_tform_widget_td; + if( node.nodeType != 1 ) return; + if( node.getAttribute('widget') ) { + hideMe(node); + } else { + var cs = node.childNodes; + for( var i = 0; cs && i < cs.length; i++ ) + oilsRptHideFilterWidgets(cs[i]); + } +} + +/* what does this need to do? */ +function oilsRptSetFilterOpActions() { +} + + + +/* hides/unhides the appropriate widgets and returns the parameter + array appropriate for the selected widget */ +function oilsRptDoFilterWidgets() { + filter = getSelectorVal(DOM.oils_rpt_filter_tform_selector); + oilsRptHideFilterWidgets(); + var op = null; + var tform = null; + var params = null; + + switch(filter) { + + /* generic transforms */ + case 'equals': + if(!op) op = 'equals'; + case 'like': + if(!op) op = 'like'; + case 'ilike': + if(!op) op = 'ilike'; + case 'gt': + if(!op) op = '>'; + case 'gte': + if(!op) op = '>='; + case 'lt': + if(!op) op = '<'; + case 'lte': + if(!op) op = '<='; + case 'in': + if(!op) op = 'in'; + case 'not_in': + if(!op) op = 'not in'; + case 'between': + if(!op) op = 'between'; + case 'not_between': + if(!op) op = 'not between'; + unHideMe(DOM.oils_rpt_filter_tform_input); + params = [DOM.oils_rpt_filter_tform_input.value]; + break; + + /* timestamp transforms */ + case 'date_between': + if(!op) op = 'between'; + case 'date_not_between': + if(!op) op = 'not between'; + tform = 'date'; + var d = new Date(); + unHideMe(DOM.oils_rpt_filter_tform_date_1); + unHideMe(DOM.oils_rpt_filter_tform_date_2); + unHideMe(DOM.oils_rpt_filter_tform_date_hint); + DOM.oils_rpt_filter_tform_date_1.value = mkYearMonDay(); + DOM.oils_rpt_filter_tform_date_2.value = mkYearMonDay(); + params = [ + DOM.oils_rpt_filter_tform_date_1.value, + DOM.oils_rpt_filter_tform_date_2.value + ]; + break; + + case 'dow_between': + op = 'between'; + if(!tform) tform = 'dow'; + case 'dow_not_between': + if(!op) op = 'not between'; + if(!tform) tform = 'dow'; + break; + + case 'dom_between': + op = 'between'; + if(!tform) tform = 'dom'; + case 'dom_not_between': + if(!op) op = 'not between'; + if(!tform) tform = 'dom'; + break; + + case 'month_between': + op = 'between'; + if(!tform) tform = 'moy'; + case 'month_not_between': + if(!op) op = 'not between'; + if(!tform) tform = 'moy'; + break; + + case 'quarter_between': + op = 'between'; + if(!tform) tform = 'qoy'; + case 'quarter_not_between': + if(!op) op = 'not between'; + if(!tform) tform = 'qoy'; + break; + + case 'year_between': + if(!op) op = 'between'; + if(!tform) tform = 'year_trunc'; + case 'year_not_between': + if(!op) op = 'not between'; + if(!tform) tform = 'year_trunc'; + break; + + case 'age_between': + if(!op) op = 'between'; + if(!tform) tform = 'age'; + case 'age_not_between': + if(!op) op = 'not between'; + if(!tform) tform = 'age'; + break; + + /* string transforms */ + case 'substring': + if(!tform) tform = 'substring'; + break; + + case 'lower': + if(!op) op = ''; + if(!tform) tform = 'dow'; + + case 'upper': + if(!op) op = ''; + if(!tform) tform = 'dow'; + + /* numeric transforms */ + case 'round': + if(!op) op = ''; + if(!tform) tform = 'dow'; + + case 'int': + if(!op) op = ''; + if(!tform) tform = 'dow'; + } + + return { op : op, params : params, tform : tform }; +} + + diff --git a/Open-ILS/web/reports/oils_rpt_builder.xhtml b/Open-ILS/web/reports/oils_rpt_builder.xhtml index cb1f307685..e9ecc058c1 100644 --- a/Open-ILS/web/reports/oils_rpt_builder.xhtml +++ b/Open-ILS/web/reports/oils_rpt_builder.xhtml @@ -23,7 +23,16 @@ - + + + @@ -34,8 +43,9 @@ - + + @@ -54,7 +64,6 @@ Reports Home -
Loading...
@@ -104,13 +113,15 @@
- + + ()
Select how this field should be displayed:
- + +


@@ -119,7 +130,15 @@
Select what filter should be applied to this field:
- +
+ + +
+
+ + +
+
diff --git a/Open-ILS/web/reports/oils_rpt_builder_widgets.js b/Open-ILS/web/reports/oils_rpt_builder_widgets.js new file mode 100644 index 0000000000..747aa59b2a --- /dev/null +++ b/Open-ILS/web/reports/oils_rpt_builder_widgets.js @@ -0,0 +1,109 @@ +function oilsRptBuilderWidget(node) { + this.init(node); +} + +oilsRptBuilderWidget.prototype.init = function(node) { + if(!node) return; + this.node = node; + _debug(this.node.id); + + this.selector = $n(this.node, 'selector'); + this.widgetNode = $n(this.node, 'widget_td'); + var obj = this; + this.selector.onchange = function() { + obj.showWidgets( + obj.selector.options[obj.selector.selectedIndex]); + } + this.hideWidgets(); +} + + +oilsRptBuilderWidget.prototype.hideWidgets = function(node) { + if(!node) node = this.widgetNode; + if( node.nodeType != 1 ) return; + if( node.getAttribute('widget') ) { + hideMe(node); + } else { + var cs = node.childNodes; + for( var i = 0; cs && i < cs.length; i++ ) + this.hideWidgets(cs[i]); + } +} + + +oilsRptBuilderWidget.prototype.showWidgets = function(opt) { + _debug("showing widget with opt value: "+opt.value); + this.hideWidgets(); + var widget = opt.getAttribute('widget'); + if( widget ) unHideMe($n(this.node, widget)); +} + +oilsRptBuilderWidget.prototype.getCurrentOpt = function() { + return this.selector.options[this.selector.selectedIndex]; +} + + + + +/* ------------------------------------------------------------------------- */ +oilsRptTFormManager.prototype = new oilsRptBuilderWidget(); +oilsRptTFormManager.prototype.constructor = oilsRptTFormManager; +oilsRptTFormManager.baseClass = oilsRptBuilderWidget.prototype.constructor; +function oilsRptTFormManager(node) { this.init(node); } + +/* displays the appropriate transforms for the given types and flags */ +oilsRptTFormManager.prototype.build = function( dtype, show_agg, show_noagg ) { + for( var i = 0; i < this.selector.options.length; i++ ) { + var opt = this.selector.options[i]; + var t = opt.getAttribute('datatype'); + if( t && t != dtype ){ + hideMe(opt); + } else { + var ag = opt.getAttribute('aggregate'); + if( ag && show_agg ) + unHideMe(opt); + else if( ag && ! show_agg ) + hideMe(opt) + else if( !ag && show_noagg ) + unHideMe(opt); + else hideMe(opt); + } + } +} + +oilsRptTFormManager.prototype.getCurrentTForm = function() { + var opt = this.getCurrentOpt(); + var data = { + value : opt.value, + datatype : opt.getAttribute('datatype'), + aggregate : opt.getAttribute('aggregate'), + }; + data.params = this.getWidgetParams(data); + return data; +} + + +oilsRptTFormManager.prototype.getWidgetParams = function(obj) { + switch(obj.datatype) { + case 'string' : + switch(obj.value) { + case 'substring': + return [ + $n(this.widgetNode, 'string_substring_offset').value, + $n(this.widgetNode, 'string_substring_length').value + ]; + } + } + return null; +} + + + + +/* ------------------------------------------------------------------------- */ + +oilsRptOpManager.prototype = new oilsRptBuilderWidget(); +oilsRptOpManager.prototype.constructor = oilsRptOpManager; +oilsRptOpManager.baseClass = oilsRptBuilderWidget.prototype.constructor; +function oilsRptOpManager(node) { this.init(node); } + diff --git a/Open-ILS/web/reports/oils_rpt_ops.xhtml b/Open-ILS/web/reports/oils_rpt_ops.xhtml new file mode 100644 index 0000000000..2af87a0b59 --- /dev/null +++ b/Open-ILS/web/reports/oils_rpt_ops.xhtml @@ -0,0 +1,74 @@ + + + + + + + + + +
+ + + + + + + + + + (YYYY-MM-DD) + + + + + + + + + + + + + + + + + + + + + +
+ + + + diff --git a/Open-ILS/web/reports/oils_rpt_tform_date.xhtml b/Open-ILS/web/reports/oils_rpt_tform_date.xhtml deleted file mode 100644 index c7c11a5944..0000000000 --- a/Open-ILS/web/reports/oils_rpt_tform_date.xhtml +++ /dev/null @@ -1,69 +0,0 @@ - - - Month Trunc
- - - - - - Month(s) Ago - - - - - - - - - - Quarter(s) Ago - - - - - - - - - Age
- - - - diff --git a/Open-ILS/web/reports/oils_rpt_tform_numeric.xhtml b/Open-ILS/web/reports/oils_rpt_tform_numeric.xhtml deleted file mode 100644 index f60949b716..0000000000 --- a/Open-ILS/web/reports/oils_rpt_tform_numeric.xhtml +++ /dev/null @@ -1,8 +0,0 @@ - - - Sum
- - - Average
- - diff --git a/Open-ILS/web/reports/oils_rpt_tform_string.xhtml b/Open-ILS/web/reports/oils_rpt_tform_string.xhtml deleted file mode 100644 index b1068499c9..0000000000 --- a/Open-ILS/web/reports/oils_rpt_tform_string.xhtml +++ /dev/null @@ -1,14 +0,0 @@ - - - - Substring - - - Offset: - - Length: - - - diff --git a/Open-ILS/web/reports/oils_rpt_tform_table.xhtml b/Open-ILS/web/reports/oils_rpt_tform_table.xhtml deleted file mode 100644 index b81f0128c6..0000000000 --- a/Open-ILS/web/reports/oils_rpt_tform_table.xhtml +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - -
- - Raw Data -
- - Count -
- - Count Distinct -
- - Min -
- - Max -
- - diff --git a/Open-ILS/web/reports/oils_rpt_tforms.xhtml b/Open-ILS/web/reports/oils_rpt_tforms.xhtml new file mode 100644 index 0000000000..1febaf7c04 --- /dev/null +++ b/Open-ILS/web/reports/oils_rpt_tforms.xhtml @@ -0,0 +1,54 @@ + + + + + + + + + + +
+ + + +
+ Offset: + + Length: + +
+ +
+ + diff --git a/Open-ILS/web/reports/oils_rpt_vars.js b/Open-ILS/web/reports/oils_rpt_vars.js index 4e074cf219..75cc54e199 100644 --- a/Open-ILS/web/reports/oils_rpt_vars.js +++ b/Open-ILS/web/reports/oils_rpt_vars.js @@ -34,12 +34,14 @@ 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 */ /* @@ -59,5 +61,11 @@ var oilsRptRegexClasses = { } */ +/* the current transform manager for the builder transform window */ +var oilsRptCurrentTform; +/* the current transform manager for the builder filter window */ +var oilsRptCurrentFilterTform; +/* the current operation manager for the filter window */ +var oilsRptCurrentFilterOpManager; -- 2.11.0