1 function removeReportAtom (args) {
4 var active_tab = filterByAttribute(
5 $('used-source-fields-tabbox').getElementsByTagName('tab'),
9 var tabname = active_tab.getAttribute('id');
11 var tabpanel = $( tabname + 'panel' );
12 var tree = tabpanel.getElementsByTagName('tree')[0];
13 var fields = getSelectedItems(tree);
15 for (var i in fields) {
16 var field = fields[i];
17 var colname = field.firstChild.firstChild.nextSibling.getAttribute('label');
19 var relation_alias = field.getAttribute('relation');
22 delete rpt_rel_cache[relation_alias].fields[tabname][colname];
24 with (rpt_rel_cache[relation_alias].fields) {
25 if ( getKeys(dis_tab).length == 0 && getKeys(filter_tab).length == 0 && getKeys(aggfilter_tab).length == 0 )
26 delete rpt_rel_cache[relation_alias];
33 function addReportAtoms () {
34 var nope = $( 'source-add' ).getAttribute('disabled');
35 if (nope == 'true') return false;
37 var class_tree = $('class-view');
38 var transform_tree = $('trans-view');
40 var active_tab = filterByAttribute(
41 $('used-source-fields-tabbox').getElementsByTagName('tab'),
46 var tabname = active_tab.getAttribute('id')
48 var items = getSelectedItems(class_tree);
49 var transform = getSelectedItems(transform_tree)[0];
51 var reltype = $('path-label').getAttribute('reltype');
52 var class_label = $('path-label').value;
53 var relation_alias = hex_md5(class_label);
55 for (var i in items) {
58 var class_path = item.getAttribute('fullpath');
59 var field_class = item.getAttribute('idlclass');
60 var datatype = item.getAttribute('datatype');
61 var colname = item.getAttribute('idlfield');
62 var field_label = item.firstChild.firstChild.getAttribute('label');
64 var table_name = getIDLClass(field_class).getAttributeNS(persistNS,'tablename');
66 if ( !rpt_rel_cache[relation_alias] ) {
67 rpt_rel_cache[relation_alias] =
68 { label : class_label,
69 alias : relation_alias,
72 idlclass : field_class,
74 fields: { dis_tab : {}, filter_tab : {}, aggfilter_tab : {} }
78 if ( !rpt_rel_cache[relation_alias].fields[tabname][colname] ) {
79 rpt_rel_cache[relation_alias].fields[tabname][colname] =
81 transform : (transform && transform.getAttribute('name')) || 'Bare',
82 aggregate : transform && transform.getAttribute('aggregate'),
83 params : transform && transform.getAttribute('params'),
84 transform_label: (transform && transform.getAttribute('alias')) || 'Raw Data',
92 if (!rpt_rel_cache.order_by)
93 rpt_rel_cache.order_by = [];
95 if (tabname == 'dis_tab')
96 rpt_rel_cache.order_by.push( { relation : relation_alias, field : colname } );
100 'You have already added the [' + field_label +
101 '] field\nfrom the [' + class_label + '] source. Click OK if you\nwould like ' +
102 'to reset this field.'
105 rpt_rel_cache[relation_alias].fields[tabname][colname] =
107 transform : (transform && transform.getAttribute('name')) || 'Bare',
108 aggregate : transform && transform.getAttribute('aggregate'),
109 params : transform && transform.getAttribute('params'),
110 transform_label: (transform && transform.getAttribute('alias')) || 'Raw Data',
123 function changeDisplayOrder (dir) {
124 var active_tab = filterByAttribute(
125 $('used-source-fields-tabbox').getElementsByTagName('tab'),
130 var tabname = active_tab.getAttribute('id');
132 var tabpanel = $( tabname + 'panel' );
133 var tree = tabpanel.getElementsByTagName('tree')[0];
134 var item = getSelectedItems(tree)[0];
136 var item_pos = tree.view.selection.currentIndex;
139 if ( item.previousSibling ) {
140 item.parentNode.insertBefore( item, item.previousSibling );
143 } else if (dir == 'd') {
144 if ( item.nextSibling ) {
145 if (item.nextSibling.nextSibling ) item.parentNode.insertBefore( item, item.nextSibling.nextSibling );
146 else item.parentNode.appendChild( item );
151 rpt_rel_cache.order_by = [];
152 var ordered_list = tree.getElementsByTagName('treeitem');
153 for (var i = 0; i < ordered_list.length; i++) {
154 rpt_rel_cache.order_by.push(
155 { relation : ordered_list[i].getAttribute('relation'),
156 field : ordered_list[i].firstChild.firstChild.nextSibling.getAttribute('label')
161 tree.view.selection.select( item_pos );
164 function alterColumnLabel () {
165 var active_tab = filterByAttribute(
166 $('used-source-fields-tabbox').getElementsByTagName('tab'),
171 var tabname = active_tab.getAttribute('id');
173 var tabpanel = $( tabname + 'panel' );
174 var tree = tabpanel.getElementsByTagName('tree')[0];
175 var items = getSelectedItems(tree);
177 for (var i in items) {
179 var relation_alias = item.getAttribute('relation');
181 var field = item.firstChild.firstChild;
182 var colname = field.nextSibling.getAttribute('label');
184 var new_label = prompt(
185 "Change the column header to:",
186 field.getAttribute("label")
190 rpt_rel_cache[relation_alias].fields[tabname][colname].alias = new_label;
196 function alterColumnTransform (trans) {
198 var transform = OILS_RPT_TRANSFORMS[trans];
200 var active_tab = filterByAttribute(
201 $('used-source-fields-tabbox').getElementsByTagName('tab'),
206 var tabname = active_tab.getAttribute('id');
208 var tabpanel = $( tabname + 'panel' );
209 var tree = tabpanel.getElementsByTagName('tree')[0];
210 var items = getSelectedItems(tree);
212 for (var i in items) {
214 var relation_alias = item.getAttribute('relation');
216 var field = item.firstChild.firstChild;
217 var colname = field.nextSibling.getAttribute('label');
219 rpt_rel_cache[relation_alias].fields[tabname][colname].transform = trans;
220 rpt_rel_cache[relation_alias].fields[tabname][colname].aggregate = transform.aggregate;
221 rpt_rel_cache[relation_alias].fields[tabname][colname].params = transform.params;
222 rpt_rel_cache[relation_alias].fields[tabname][colname].transform_label = transform.label;
230 function changeOperator (args) {
232 var active_tab = filterByAttribute(
233 $('used-source-fields-tabbox').getElementsByTagName('tab'),
238 var tabname = active_tab.getAttribute('id');
240 var tabpanel = $( tabname + 'panel' );
241 var tree = tabpanel.getElementsByTagName('tree')[0];
242 var items = getSelectedItems(tree);
244 for (var i in items) {
246 var relation_alias = item.getAttribute('relation');
248 var field = item.firstChild.firstChild;
249 var colname = field.nextSibling.getAttribute('label');
251 rpt_rel_cache[relation_alias].fields[tabname][colname].op = args.op;
252 rpt_rel_cache[relation_alias].fields[tabname][colname].op_label = args.label;
260 function removeTemplateFilterValue () {
262 var active_tab = filterByAttribute(
263 $('used-source-fields-tabbox').getElementsByTagName('tab'),
268 var tabname = active_tab.getAttribute('id');
270 var tabpanel = $( tabname + 'panel' );
271 var tree = tabpanel.getElementsByTagName('tree')[0];
272 var items = getSelectedItems(tree);
274 for (var i in items) {
276 var relation_alias = item.getAttribute('relation');
278 var field = item.firstChild.firstChild;
279 var colname = field.nextSibling.getAttribute('label');
281 rpt_rel_cache[relation_alias].fields[tabname][colname].op_value = {};
287 function timestampSetDate (obj, cal, date) {
288 obj.op_value.value = date;
289 obj.op_value.object = cal.date;
290 obj.op_value.label = '"' + date + '"';
297 function changeTemplateFilterValue () {
299 var active_tab = filterByAttribute(
300 $('used-source-fields-tabbox').getElementsByTagName('tab'),
305 var tabname = active_tab.getAttribute('id');
307 var tabpanel = $( tabname + 'panel' );
308 var tree = tabpanel.getElementsByTagName('tree')[0];
309 var items = getSelectedItems(tree);
311 var targetCmd = $( tabname + '_value_action' );
313 targetCmd.menu = null;
314 targetCmd.command = null;
315 targetCmd.oncommand = null;
316 targetCmd.removeEventListener( 'command', __handler_cache, true );
318 for (var i in items) {
320 var relation_alias = item.getAttribute('relation');
322 var field = item.firstChild.firstChild;
323 var colname = field.nextSibling.getAttribute('label');
325 var obj = rpt_rel_cache[relation_alias].fields[tabname][colname]
326 var operation = OILS_RPT_FILTERS[obj.op];
328 switch (obj.datatype) {
330 var cal_popup = $('calendar-widget');
332 while (cal_popup.firstChild) cal_popup.removeChild(cal_popup.lastChild);
333 var calendar = new Calendar(
336 function (cal,date) { timestampSetDate(obj,cal,date) },
337 function (cal) { cal_popup.hidePopup(); cal.destroy(); }
340 var format = OILS_RPT_TRANSFORMS[obj.transform].cal_format || '%Y-%m-%d';
342 calendar.setDateFormat(format);
343 calendar.create(cal_popup);
345 targetCmd.menu = 'calendar-widget';
351 function __bool_value_event_handler () {
355 // get a reference to the prompt service component.
356 var promptService = Components.classes["@mozilla.org/embedcomp/prompt-service;1"]
357 .getService(Components.interfaces.nsIPromptService);
359 // set the buttons that will appear on the dialog. It should be
360 // a set of constants multiplied by button position constants. In this case,
361 // three buttons appear, Save, Cancel and a custom button.
362 var flags=promptService.BUTTON_TITLE_IS_STRING * promptService.BUTTON_POS_0 +
363 promptService.BUTTON_TITLE_IS_STRING * promptService.BUTTON_POS_1 +
364 promptService.BUTTON_TITLE_CANCEL * promptService.BUTTON_POS_2;
366 // display the dialog box. The flags set above are passed
367 // as the fourth argument. The next three arguments are custom labels used for
368 // the buttons, which are used if BUTTON_TITLE_IS_STRING is assigned to a
369 // particular button. The last two arguments are for an optional check box.
370 answer = promptService.select(
373 "Select the value, or cancel:",
374 2, ["True", "False"], state
378 state = confirm("Click OK for TRUE and Cancel for FALSE.");
379 state ? state = 0 : state = 1;
384 obj.op_value.value = 'f';
385 obj.op_value.label = 'False';
387 obj.op_value.value = 't';
388 obj.op_value.label = 'True';
392 targetCmd.removeEventListener( 'command', __bool_value_event_handler, true );
396 __handler_cache = __bool_value_event_handler;
397 targetCmd.addEventListener( 'command', __bool_value_event_handler, true );
404 var promptstring = "Field does not match one of list (comma separated):";
408 promptstring = "Field value is not between (comma separated):";
412 promptstring = "Field value is between (comma separated):";
416 promptstring = "Field does not match one of list (comma separated):";
420 promptstring = "Field matches one of list (comma separated):";
424 promptstring = "Value " + obj.op_label + ":";
428 function __default_value_event_handler () {
430 if (_v = prompt( promptstring, obj.op_value.value || '' )) {
436 obj.op_value.value = _v.split(/\s*,\s*/);
440 obj.op_value.value = _v;
444 obj.op_value.label = '"' + obj.op_value.value + '"';
447 targetCmd.removeEventListener( 'command', __default_value_event_handler, true );
451 __handler_cache = __default_value_event_handler;
452 targetCmd.addEventListener( 'command', __default_value_event_handler, true );
458 //renderSources(true);
461 function populateOperatorContext () {
463 var active_tab = filterByAttribute(
464 $('used-source-fields-tabbox').getElementsByTagName('tab'),
469 var tabname = active_tab.getAttribute('id');
471 var tabpanel = $( tabname + 'panel' );
472 var tree = tabpanel.getElementsByTagName('tree')[0];
473 var items = getSelectedItems(tree);
476 for (var i in items) {
478 dtypes.push( item.getAttribute('datatype') );
481 var menu = $(tabname + '_op_menu');
482 while (menu.firstChild) menu.removeChild(menu.lastChild);
484 for (var i in OILS_RPT_FILTERS) {
485 var o = OILS_RPT_FILTERS[i];
489 oncommand : "changeOperator({op:'"+i+"',label:'"+o.label+"'})",
494 var keys = getKeys(o.labels);
495 for ( var k in keys ) {
497 if ( grep(function(x){return key==x},dtypes).length ) {
500 { label : o.labels[key],
501 oncommand : "changeOperator({op:'"+i+"',label:'"+o.labels[key]+"'})",
511 function populateTransformContext () {
513 var active_tab = filterByAttribute(
514 $('used-source-fields-tabbox').getElementsByTagName('tab'),
519 var tabname = active_tab.getAttribute('id');
521 var tabpanel = $( tabname + 'panel' );
522 var tree = tabpanel.getElementsByTagName('tree')[0];
523 var items = getSelectedItems(tree);
526 for (var i in items) {
528 var dtype = item.getAttribute('datatype');
529 var item_transforms = getTransforms({ datatype : dtype });
531 for (var j in item_transforms) {
532 transforms[item_transforms[j]] = OILS_RPT_TRANSFORMS[item_transforms[j]];
533 transforms[item_transforms[j]].name = item_transforms[j];
537 var transformList = [];
538 for (var i in transforms) {
539 transformList.push( transforms[i] );
542 transformList.sort( sortHashLabels );
544 var menu = $(tabname + '_trans_menu');
545 while (menu.firstChild) menu.removeChild(menu.lastChild);
547 for (var i in transformList) {
548 var t = transformList[i];
550 if (tabname.match(/filter/)) {
551 if (tabname.match(/^agg/)) {
552 if (!t.aggregate) continue;
554 if (t.aggregate) continue;
560 { aggregate : t.aggregate,
565 oncommand : "alterColumnTransform('"+t.name+"')",
571 menu.parentNode.setAttribute('disabled','false');
572 if (menu.childNodes.length == 0) {
573 menu.parentNode.setAttribute('disabled','true');
578 function renderSources (selected) {
580 var tree = $('used-sources');
581 var sources = $('used-sources-treetop');
582 var tabs = $('used-source-fields-tabbox').getElementsByTagName('tab');
585 while (sources.firstChild) sources.removeChild(sources.lastChild);
587 selected = getSelectedItems(tree);
588 if (!selected.length) {
589 selected = undefined;
590 while (sources.firstChild) sources.removeChild(sources.lastChild);
594 for (var j = 0; j < tabs.length; j++) {
596 var tabname = tab.getAttribute('id')
597 var tabpanel = $( tab.getAttribute('id') + 'panel' );
598 var fieldtree = tabpanel.getElementsByTagName('treechildren')[0];
600 while (fieldtree.firstChild) fieldtree.removeChild(fieldtree.lastChild);
603 for (var relation_alias in rpt_rel_cache) {
604 if (!rpt_rel_cache[relation_alias].fields) continue;
610 return x.getAttribute('relation') == relation_alias;
617 $('used-sources-treetop').appendChild(
619 { relation : rpt_rel_cache[relation_alias].alias,
620 idlclass : rpt_rel_cache[relation_alias].idlclass,
621 reltype : rpt_rel_cache[relation_alias].reltype,
622 path : rpt_rel_cache[relation_alias].path,
626 createTreeCell({ label : rpt_rel_cache[relation_alias].label }),
627 createTreeCell({ label : rpt_rel_cache[relation_alias].table }),
628 createTreeCell({ label : rpt_rel_cache[relation_alias].alias }),
629 createTreeCell({ label : rpt_rel_cache[relation_alias].reltype })
635 for each (var tabname in ['filter_tab','aggfilter_tab']) {
636 tabpanel = $( tabname + 'panel' );
637 fieldtree = tabpanel.getElementsByTagName('treechildren')[0];
639 for (var colname in rpt_rel_cache[relation_alias].fields[tabname]) {
640 with (rpt_rel_cache[relation_alias].fields[tabname][colname]) {
641 fieldtree.appendChild(
643 { relation : relation_alias, datatype : datatype },
646 createTreeCell({ label : alias }),
647 createTreeCell({ label : colname }),
648 createTreeCell({ label : datatype }),
649 createTreeCell({ label : transform_label }),
650 createTreeCell({ label : transform })
655 fieldtree.lastChild.firstChild.appendChild(
656 createTreeCell({ op : op, label : op_label })
659 if (op_value.value != undefined) {
660 fieldtree.lastChild.firstChild.appendChild(
661 createTreeCell({ label : op_value.label })
669 tabpanel = $( 'dis_tabpanel' );
670 fieldtree = tabpanel.getElementsByTagName('treechildren')[0];
671 for each (var order in rpt_rel_cache.order_by) {
677 return x.getAttribute('relation') == order.relation;
684 with (rpt_rel_cache[order.relation].fields.dis_tab[order.field]) {
685 fieldtree.appendChild(
687 { relation : order.relation, datatype : datatype },
690 createTreeCell({ label : alias }),
691 createTreeCell({ label : colname }),
692 createTreeCell({ label : datatype }),
693 createTreeCell({ label : transform_label }),
694 createTreeCell({ label : transform })
699 fieldtree.lastChild.firstChild.appendChild(
700 createTreeCell({ op : op, label : op_label })
703 if (op_value.value != undefined) {
704 fieldtree.lastChild.firstChild.appendChild(
705 createTreeCell({ label : op_value.label })
715 filter_tab : 'where',
716 aggfilter_tab : 'having',
720 function save_template () {
725 core_class : $('sources-treetop').getElementsByTagName('treeitem')[0].getAttribute('idlclass'),
733 for (var relname in rpt_rel_cache) {
734 var relation = rpt_rel_cache[relname];
735 if (!relation.fields) continue;
737 // first, add the where and having clauses (easier)
738 for each (var tab_name in [ 'filter_tab', 'aggfilter_tab' ]) {
739 var tab = relation.fields[tab_name];
740 for (var field in tab) {
741 fleshTemplateField( template, relation, tab_name, field );
745 // now the from clause
746 fleshFromPath( template, relation );
749 // and now for select (based on order_by)
750 for each (var order in rpt_rel_cache.order_by)
751 fleshTemplateField( template, rpt_rel_cache[order.relation], 'dis_tab', order.field );
753 prompt( 'template', js2JSON( template ) );
756 function fleshFromPath ( template, rel ) {
757 var table_path = rel.path.split( /\./ );
758 if (table_path.length > 1 || rel.path.indexOf('-') > -1) table_path.push( rel.idlclass );
762 var current_path = '';
763 var current_obj = template.from;
765 while (link = table_path.shift()) {
766 if (current_path) current_path += '-';
767 current_path += link;
769 var leaf = table_path.length == 0 ? true : false;
771 current_obj.path = current_path;
772 current_obj.table = getIDLClass( link.split(/-/)[0] ).getAttributeNS( persistNS, 'tablename' );
774 if (prev_link != '') {
775 var prev_class = getIDLClass( prev_link.split(/-/)[0] );
776 var prev_field = prev_link.split(/-/)[1];
778 var current_link = getIDLLink( prev_class, prev_field );
779 current_obj.key = current_link.getAttribute('key');
782 current_link.getAttribute('reltype') != 'has_a' ||
783 prev_type == 'left' ||
784 rel.reltype != 'has_a'
785 ) current_obj.type = 'left';
787 prev_type = current_obj.type;
791 current_obj.label = rel.label;
792 current_obj.alias = rel.alias;
793 current_obj.idlclass = rel.idlclass;
794 current_obj.template_path = rel.path;
796 var current_class = getIDLClass( link.split(/-/)[0] );
797 var join_field = link.split(/-/)[1];
798 var join_link = getIDLLink(current_class, join_field);
800 if (join_link.getAttribute('reltype') != 'has_a') {
801 var fields_el = current_class.getElementsByTagName('fields')[0];
802 join_field = fields_el.getAttributeNS(persistNS, 'primary') + '-' + join_link.getAttribute('key');
805 current_obj.alias = hex_md5( current_path ) ;
806 join_field += '-' + current_obj.alias;
807 if (table_path.length == 1) join_field += '-' + rel.alias;
809 if (!current_obj.join) current_obj.join = {};
810 if (!current_obj.join[join_field]) current_obj.join[join_field] = {};
812 if (current_obj.type == 'left') current_obj.join[join_field].type = 'left';
814 current_obj = current_obj.join[join_field];
823 function fleshTemplateField ( template, rel, tab_name, field ) {
825 if (!rel.fields[tab_name] || !rel.fields[tab_name][field]) return;
827 var tab = rel.fields[tab_name];
829 var field_path = rel.path + '-' + field;
830 field_path = field_path.replace(/\./g, '-');
833 alias : tab[field].alias,
836 transform : tab[field].transform,
837 transform_label : tab[field].transform_label
843 if (tab_name.match(/filter/)) {
844 element.condition = {};
845 element.condition[tab[field].op] =
846 tab[field].op_value.value ?
847 tab[field].op_value.value :
848 '::P' + param_count++;
851 template[tab_use[tab_name]].push(element);