1 /** initializes reports, some basid display settings,
2 * grabs and builds the IDL tree
4 function oilsInitReportBuilder() {
6 oilsReportBuilderReset();
7 DOM.oils_rpt_table.onclick =
8 function(){hideMe(DOM.oils_rpt_column_editor)};
9 //oilsRptBuildCalendars();
12 hideMe(DOM.oils_rpt_tree_loading);
13 unHideMe(DOM.oils_rpt_table);
18 function oilsReportBuilderReset() {
19 var n = (oilsRpt) ? oilsRpt.name : "";
20 oilsRpt = new oilsReport();
22 oilsRptDisplaySelector = DOM.oils_rpt_display_selector;
23 oilsRptFilterSelector = DOM.oils_rpt_filter_selector;
24 removeChildren(oilsRptDisplaySelector);
25 removeChildren(oilsRptFilterSelector);
31 function oilsRptBuildCalendars() {
33 inputField : "oils_rpt_filter_tform_timestamp_input", // id of the input field
34 ifFormat : "%Y-%m-%d", // format of the input field
35 button : "oils_rpt_filter_tform_timestamp_cal", // trigger for the calendar (button ID)
36 align : "Tl", // alignment (defaults to "Bl")
40 inputField : "oils_rpt_filter_tform_timestamp_input_2", // id of the input field
41 ifFormat : "%Y-%m-%d", // format of the input field
42 button : "oils_rpt_filter_tform_timestamp_cal2", // trigger for the calendar (button ID)
43 align : "Tl", // alignment (defaults to "Bl")
51 /* returns just the column name */
52 function oilsRptPathCol(path) {
53 var parts = path.split(/-/);
57 /* returns the IDL class of the selected column */
58 function oilsRptPathClass(path) {
59 var parts = path.split(/-/);
64 /* returns everything prior to the column name */
65 function oilsRptPathRel(path) {
66 var parts = path.split(/-/);
68 return parts.join('-');
71 /* creates a label "path" based on the column path */
72 function oilsRptMakeLabel(path) {
73 var parts = path.split(/-/);
75 for( var i = 0; i < parts.length; i++ ) {
78 str += oilsIDL[parts[i]].label;
80 var f = oilsRptFindField(oilsIDL[parts[i-1]], parts[i]);
88 /* adds an item to the display window */
89 function oilsAddRptDisplayItem(path, name, tform, params) {
90 if( ! oilsAddSelectorItem(oilsRptDisplaySelector, path, name) )
93 /* add the selected columns to the report output */
94 name = (name) ? name : oilsRptPathCol(path);
95 var param = oilsRptNextParam();
97 /* add this item to the select blob */
99 relation:oilsRptPathRel(path),
106 params.unshift(oilsRptPathCol(path));
107 sel.column[tform] = params;
109 sel.column[tform] = oilsRptPathCol(path);
111 } else { sel.column = oilsRptPathCol(path); }
113 oilsRpt.def.select.push(sel);
115 mergeObjects( oilsRpt.def.from, oilsRptBuildFromClause(path));
116 oilsRpt.params[param] = name;
120 /* takes a column path and builds a from-clause object for the path */
121 function oilsRptBuildFromClause(path) {
122 var parts = path.split(/-/);
127 for( var i = 0; i < parts.length; i += 2 ) {
129 var col = parts[i+1];
130 var node = oilsIDL[parts[i]];
131 var field = oilsRptFindField(node, col);
132 newpath = (newpath) ? newpath + '-'+ cls : cls;
134 tobj.table = node.table;
135 tobj.alias = newpath;
136 _debug('field type is ' + field.type);
137 if( i == (parts.length - 2) ) break;
143 if( field.type == 'link' )
144 tobj.key = field.key;
146 newpath = newpath + '-'+ col;
149 _debug("built 'from' clause: path="+path+"\n"+formatJSON(js2JSON(obj)));
154 /* removes a specific item from the display window */
155 function oilsDelDisplayItem(val) {
156 oilsDelSelectorItem(oilsRptDisplaySelector, val);
159 /* removes selected items from the display window */
160 function oilsDelSelectedDisplayItems() {
161 var list = oilsDelSelectedItems(oilsRptDisplaySelector);
163 /* remove the de-selected columns from the report output */
164 oilsRpt.def.select = grep( oilsRpt.def.select,
166 for( var j = 0; j < list.length; j++ ) {
170 /* if this columsn has a transform,
171 it will be an object { tform => column } */
172 if( typeof col != 'string' )
173 for( var c in col ) col = col[c];
175 /* if this transform requires params, the column
176 will be the first item in the param set array */
177 if( typeof col != 'string' ) col = col[0];
179 if( oilsRptPathRel(d) == i.relation && oilsRptPathCol(d) == col ) {
180 var param = (i.alias) ? i.alias.match(/::PARAM\d*/) : null;
181 if( param ) delete oilsRpt.params[param];
189 if(!oilsRpt.def.select) {
190 oilsRpt.def.select = [];
191 oilsReportBuilderReset();
194 for( var j = 0; j < list.length; j++ )
195 /* if there are no items left in the "select" clause for the given
196 relation, trim this relation from the "from" clause */
197 if(!grep(oilsRpt.def.select,
198 function(i){ return (i.relation == oilsRptPathRel(list[j])); }))
199 oilsRptPruneFromClause(oilsRptPathRel(list[j]));
205 /* for each item in the path list, remove the associated data
206 from the "from" clause */
208 function oilsRptPruneFromClause(relation, node) {
209 _debug("removing relation from 'from' clause " + relation);
210 if(!node) node = oilsRpt.def.from.join;
211 for( var i in node ) {
212 if( node[i].alias == relation ) {
214 /* if we have subtrees, don't delete our tree node */
222 if( oilsRptPruneFromClause(relation, node[i].join ) ) {
223 if(oilsRptObjectKeys(node[i].join).length == 0) {
225 /* if there are no items in the select clause with a relation matching
226 this nodes alias, we can safely remove this node from the tree */
227 if(!grep(oilsRpt.def.select,function(r){return (r.relation==node[i].alias)}))
238 /* adds an item to the display window */
239 function oilsAddRptFilterItem(val) {
240 oilsAddSelectorItem(oilsRptFilterSelector, val);
243 /* removes a specific item from the display window */
244 function oilsDelFilterItem(val) {
245 oilsDelSelectorItem(oilsRptFilterSelector, val);
248 /* removes selected items from the display window */
249 function oilsDelSelectedFilterItems() {
250 oilsDelSelectedItems(oilsRptFilterSelector);
254 /* adds an item to the display window */
255 function oilsAddSelectorItem(sel, val, name) {
256 name = (name) ? name : oilsRptMakeLabel(val);
257 _debug("adding selector item "+name+' = ' +val);
258 for( var i = 0; i < sel.options.length; i++ ) {
259 var opt = sel.options[i];
260 if( opt.value == val ) return false;
262 insertSelectorVal( sel, -1, name, val );
267 /* removes a specific item from the display window */
268 function oilsDelSelectorItem(sel, val) {
269 _debug("deleting selector item "+val);
270 var opts = sel.options;
271 for( var i = 0; i < opts.length; i++ ) {
273 if( opt.value == val ) {
274 if( i == opts.length - 1 )
276 else opts[i] = opts[i+1];
282 /* removes selected items from the display window */
283 function oilsDelSelectedItems(sel) {
284 var list = getSelectedList(sel);
285 for( var i = 0; i < list.length; i++ )
286 oilsDelSelectorItem(sel, list[i]);
291 /* hides the different field editor tabs */
292 function oilsRptHideEditorDivs() {
293 hideMe(DOM.oils_rpt_tform_div);
294 hideMe(DOM.oils_rpt_filter_div);
295 hideMe(DOM.oils_rpt_agg_filter_div);
300 This draws the 3-tabbed window containing the transform,
301 filter, and aggregate filter picker window
303 function oilsRptDrawDataWindow(path) {
304 var col = oilsRptPathCol(path);
305 var cls = oilsRptPathClass(path);
306 var field = oilsRptFindField(oilsIDL[cls], col);
308 appendClear(DOM.oils_rpt_editor_window_label, text(oilsRptMakeLabel(path)));
309 appendClear(DOM.oils_rpt_editor_window_datatype, text(field.datatype));
311 _debug("setting update data window for column "+col+' on class '+cls);
313 var div = DOM.oils_rpt_column_editor;
314 /* set a preliminary top position so the page won't bounce around */
315 div.setAttribute('style','top:'+oilsMouseX+'px');
317 /* unhide the div so we can determine the dimensions */
320 /* don't let them see the floating div until the position is fully determined */
321 div.style.visibility='hidden';
323 oilsRptDrawTransformWindow(path, col, cls, field);
324 oilsRptDrawFilterWindow(path, col, cls, field);
326 //oilsRptSetFilters(field.datatype);
328 //oilsRptDoFilterWidgets();
330 //DOM.oils_rpt_filter_tform_selector.onchange = oilsRptDoFilterWidgets;
332 buildFloatingDiv(div, 600);
334 /* now let them see it */
335 div.style.visibility='visible';
337 oilsRptSetDataWindowActions(div);
341 function oilsRptSetDataWindowActions(div) {
342 /* give the tab links behavior */
343 DOM.oils_rpt_tform_tab.onclick =
344 function(){oilsRptHideEditorDivs();unHideMe(DOM.oils_rpt_tform_div)};
345 DOM.oils_rpt_filter_tab.onclick =
346 function(){oilsRptHideEditorDivs();unHideMe(DOM.oils_rpt_filter_div)};
347 DOM.oils_rpt_agg_filter_tab.onclick =
348 function(){oilsRptHideEditorDivs();unHideMe(DOM.oils_rpt_agg_filter_div)};
350 DOM.oils_rpt_tform_tab.onclick();
351 DOM.oils_rpt_column_editor_close_button.onclick = function(){hideMe(div);};
355 function oilsRptDrawFilterWindow(path, col, cls, field) {
356 oilsRptCurrentFilterTform = new oilsRptTFormManager(DOM.oils_rpt_filter_tform_table);
357 oilsRptCurrentFilterTform.build(field.datatype, false, true);
358 oilsRptCurrentFilterOpManager = new oilsRptOpManager(DOM.oils_rpt_filter_op_table);
362 /* draws the transform window */
363 function oilsRptDrawTransformWindow(path, col, cls, field) {
364 DOM.oils_rpt_tform_label_input.value = oilsRptMakeLabel(path);
365 var dtype = field.datatype;
367 DOM.oils_rpt_tform_submit.onclick =
370 var tform = oilsRptGetTform(dtype);
371 _debug('found tform: ' + js2JSON(tform));
372 var params = getRptTformParams(dtype, tform);
373 _debug('found tform params: ' + js2JSON(params));
374 tform = (tform == 'raw') ? null : tform;
377 var tform = oilsRptCurrentTform.getCurrentTForm();
378 oilsAddRptDisplayItem(path, DOM.oils_rpt_tform_label_input.value, tform.value, tform.params )
382 DOM.oils_rpt_tform_label_input.focus();
383 DOM.oils_rpt_tform_label_input.select();
385 oilsRptCurrentTform = new oilsRptTFormManager(DOM.oils_rpt_tform_table);
386 oilsRptCurrentTform.build(dtype, true, true);
389 oilsRptHideTformFields();
390 oilsRptUnHideTformFields(dtype);
393 _debug("Building transiform window for datatype "+dtype);
396 unHideMe($('oils_rpt_tform_'+dtype+'_div'));
397 $('oils_rpt_tform_all_raw').checked = true;
402 function oilsRptHideTformFields() {
403 var rows = DOM.oils_rpt_tform_tbody.childNodes;
404 for( var i = 0; i < rows.length; i++ )
405 if( rows[i] && rows[i].nodeType == 1 )
409 function oilsRptUnHideTformFields(dtype) {
410 var rows = DOM.oils_rpt_tform_tbody.childNodes;
411 for( var i = 0; i < rows.length; i++ ) {
413 if( row && row.nodeType == 1 &&
414 (row.getAttribute('datatype')=='all'
415 || row.getAttribute('datatype') == dtype)) {
422 function oilsRptGetTform(datatype) {
423 for( var i in oilsRptTransforms[datatype] )
424 if( $('oils_rpt_tform_'+datatype+'_'+oilsRptTransforms[datatype][i]).checked )
425 return oilsRptTransforms[datatype][i];
426 for( var i in oilsRptTransforms.all )
427 if( $('oils_rpt_tform_all_'+oilsRptTransforms.all[i]).checked )
428 return oilsRptTransforms.all[i];
435 function getRptTformParams(type, tform) {
441 DOM.oils_rpt_tform_string_substring_offset.value,
442 DOM.oils_rpt_tform_string_substring_length.value];
449 /* given a transform selector, this displays the appropriate
450 transforms for the given datatype.
451 if aggregate is true, is displays the aggregate transforms */
453 function oilsRptSetTransforms(sel, dtype, show_agg, show_noagg) {
454 for( var i = 0; i < sel.options.length; i++ ) {
455 var opt = sel.options[i];
456 var t = opt.getAttribute('datatype');
457 if( t && t != dtype ){
460 var ag = opt.getAttribute('aggregate');
463 else if( ag && ! show_agg )
465 else if( !ag && show_noagg )
475 /* displays the correct filter-transforms for the given datatype */
477 function oilsRptSetFilters(dtype) {
479 DOM.oils_rpt_filter_submit.onclick = function() {
480 var data = oilsRptDoFilterWidgets();
481 alert(js2JSON(data));
484 var sel = DOM.oils_rpt_filter_tform_selector;
485 for( var i = 0; i < sel.options.length; i++ ) {
486 var opt = sel.options[i];
487 _debug(opt.getAttribute('op'));
488 var t = opt.getAttribute('datatype');
489 if( t && t != dtype ) hideMe(opt);
495 /* hides all of the filter widgets */
496 function oilsRptHideFilterWidgets(node) {
498 node = DOM.oils_rpt_filter_tform_widget_td;
499 if( node.nodeType != 1 ) return;
500 if( node.getAttribute('widget') ) {
503 var cs = node.childNodes;
504 for( var i = 0; cs && i < cs.length; i++ )
505 oilsRptHideFilterWidgets(cs[i]);
509 /* what does this need to do? */
510 function oilsRptSetFilterOpActions() {
515 /* hides/unhides the appropriate widgets and returns the parameter
516 array appropriate for the selected widget */
517 function oilsRptDoFilterWidgets() {
518 filter = getSelectorVal(DOM.oils_rpt_filter_tform_selector);
519 oilsRptHideFilterWidgets();
526 /* generic transforms */
528 if(!op) op = 'equals';
532 if(!op) op = 'ilike';
544 if(!op) op = 'not in';
546 if(!op) op = 'between';
548 if(!op) op = 'not between';
549 unHideMe(DOM.oils_rpt_filter_tform_input);
550 params = [DOM.oils_rpt_filter_tform_input.value];
553 /* timestamp transforms */
555 if(!op) op = 'between';
556 case 'date_not_between':
557 if(!op) op = 'not between';
560 unHideMe(DOM.oils_rpt_filter_tform_date_1);
561 unHideMe(DOM.oils_rpt_filter_tform_date_2);
562 unHideMe(DOM.oils_rpt_filter_tform_date_hint);
563 DOM.oils_rpt_filter_tform_date_1.value = mkYearMonDay();
564 DOM.oils_rpt_filter_tform_date_2.value = mkYearMonDay();
566 DOM.oils_rpt_filter_tform_date_1.value,
567 DOM.oils_rpt_filter_tform_date_2.value
573 if(!tform) tform = 'dow';
574 case 'dow_not_between':
575 if(!op) op = 'not between';
576 if(!tform) tform = 'dow';
581 if(!tform) tform = 'dom';
582 case 'dom_not_between':
583 if(!op) op = 'not between';
584 if(!tform) tform = 'dom';
587 case 'month_between':
589 if(!tform) tform = 'moy';
590 case 'month_not_between':
591 if(!op) op = 'not between';
592 if(!tform) tform = 'moy';
595 case 'quarter_between':
597 if(!tform) tform = 'qoy';
598 case 'quarter_not_between':
599 if(!op) op = 'not between';
600 if(!tform) tform = 'qoy';
604 if(!op) op = 'between';
605 if(!tform) tform = 'year_trunc';
606 case 'year_not_between':
607 if(!op) op = 'not between';
608 if(!tform) tform = 'year_trunc';
612 if(!op) op = 'between';
613 if(!tform) tform = 'age';
614 case 'age_not_between':
615 if(!op) op = 'not between';
616 if(!tform) tform = 'age';
619 /* string transforms */
621 if(!tform) tform = 'substring';
626 if(!tform) tform = 'dow';
630 if(!tform) tform = 'dow';
632 /* numeric transforms */
635 if(!tform) tform = 'dow';
639 if(!tform) tform = 'dow';
642 return { op : op, params : params, tform : tform };