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);
16 for (var i in fields) {
17 var field = fields[i];
18 var colname = field.firstChild.firstChild.nextSibling.getAttribute('label');
19 var relation_alias = field.getAttribute('relation');
21 delete rpt_rel_cache[relation_alias].fields[tabname][colname];
22 if (tabname == 'dis_tab') {
24 for each (var _o_col in rpt_rel_cache.order_by) {
25 if (_o_col.relation == relation_alias && _o_col.field == colname) continue;
26 _o_tmp.push( _o_col );
28 rpt_rel_cache.order_by = _o_tmp
31 with (rpt_rel_cache[relation_alias].fields) {
32 if ( getKeys(dis_tab).length == 0 && getKeys(filter_tab).length == 0 && getKeys(aggfilter_tab).length == 0 )
33 delete rpt_rel_cache[relation_alias];
42 function addReportAtoms () {
43 var nope = $( 'source-add' ).getAttribute('disabled');
44 if (nope == 'true') return false;
46 var class_tree = $('class-view');
47 var transform_tree = $('trans-view');
49 var active_tab = filterByAttribute(
50 $('used-source-fields-tabbox').getElementsByTagName('tab'),
55 var tabname = active_tab.getAttribute('id')
57 var items = getSelectedItems(class_tree);
58 var transform = getSelectedItems(transform_tree)[0];
60 var reltype = $('path-label').getAttribute('reltype');
61 var class_label = $('path-label').value;
62 var relation_alias = hex_md5(class_label);
64 for (var i in items) {
67 var class_path = item.getAttribute('fullpath');
68 var field_class = item.getAttribute('idlclass');
69 var datatype = item.getAttribute('datatype');
70 var colname = item.getAttribute('idlfield');
71 var field_label = item.firstChild.firstChild.getAttribute('label');
73 var table_name = getIDLClass(field_class).getAttributeNS(persistNS,'tablename');
75 if ( !rpt_rel_cache[relation_alias] ) {
76 rpt_rel_cache[relation_alias] =
77 { label : class_label,
78 alias : relation_alias,
81 idlclass : field_class,
83 fields: { dis_tab : {}, filter_tab : {}, aggfilter_tab : {} }
87 if ( !rpt_rel_cache[relation_alias].fields[tabname][colname] ) {
88 rpt_rel_cache[relation_alias].fields[tabname][colname] =
90 transform : (transform && transform.getAttribute('name')) || 'Bare',
91 aggregate : transform && transform.getAttribute('aggregate'),
92 params : transform && transform.getAttribute('params'),
93 transform_label: (transform && transform.getAttribute('alias')) || 'Raw Data',
101 if (!rpt_rel_cache.order_by)
102 rpt_rel_cache.order_by = [];
104 if (tabname == 'dis_tab')
105 rpt_rel_cache.order_by.push( { relation : relation_alias, field : colname } );
109 'You have already added the [' + field_label +
110 '] field\nfrom the [' + class_label + '] source. Click OK if you\nwould like ' +
111 'to reset this field.'
114 rpt_rel_cache[relation_alias].fields[tabname][colname] =
116 transform : (transform && transform.getAttribute('name')) || 'Bare',
117 aggregate : transform && transform.getAttribute('aggregate'),
118 params : transform && transform.getAttribute('params'),
119 transform_label: (transform && transform.getAttribute('alias')) || 'Raw Data',
134 function changeDisplayOrder (dir) {
135 var active_tab = filterByAttribute(
136 $('used-source-fields-tabbox').getElementsByTagName('tab'),
141 var tabname = active_tab.getAttribute('id');
143 var tabpanel = $( tabname + 'panel' );
144 var tree = tabpanel.getElementsByTagName('tree')[0];
145 var item = getSelectedItems(tree)[0];
147 var item_pos = tree.view.selection.currentIndex;
150 if ( item.previousSibling ) {
151 item.parentNode.insertBefore( item, item.previousSibling );
154 } else if (dir == 'd') {
155 if ( item.nextSibling ) {
156 if (item.nextSibling.nextSibling ) item.parentNode.insertBefore( item, item.nextSibling.nextSibling );
157 else item.parentNode.appendChild( item );
162 rpt_rel_cache.order_by = [];
163 var ordered_list = tree.getElementsByTagName('treeitem');
164 for (var i = 0; i < ordered_list.length; i++) {
165 rpt_rel_cache.order_by.push(
166 { relation : ordered_list[i].getAttribute('relation'),
167 field : ordered_list[i].firstChild.firstChild.nextSibling.getAttribute('label')
172 tree.view.selection.select( item_pos );
176 function alterColumnLabel () {
177 var active_tab = filterByAttribute(
178 $('used-source-fields-tabbox').getElementsByTagName('tab'),
183 var tabname = active_tab.getAttribute('id');
185 var tabpanel = $( tabname + 'panel' );
186 var tree = tabpanel.getElementsByTagName('tree')[0];
187 var item_pos = tree.view.selection.currentIndex;
189 var item = getSelectedItems(tree)[0];
190 var relation_alias = item.getAttribute('relation');
192 var field = item.firstChild.firstChild;
193 var colname = field.nextSibling.getAttribute('label');
195 var new_label = prompt(
196 "Change the column header to:",
197 field.getAttribute("label")
201 rpt_rel_cache[relation_alias].fields[tabname][colname].alias = new_label;
203 tree.view.selection.select( item_pos );
209 function alterColumnTransform (trans) {
211 var transform = OILS_RPT_TRANSFORMS[trans];
213 var active_tab = filterByAttribute(
214 $('used-source-fields-tabbox').getElementsByTagName('tab'),
219 var tabname = active_tab.getAttribute('id');
221 var tabpanel = $( tabname + 'panel' );
222 var tree = tabpanel.getElementsByTagName('tree')[0];
223 var item_pos = tree.view.selection.currentIndex;
224 var item = getSelectedItems(tree)[0];
225 var relation_alias = item.getAttribute('relation');
227 var field = item.firstChild.firstChild;
228 var colname = field.nextSibling.getAttribute('label');
230 rpt_rel_cache[relation_alias].fields[tabname][colname].transform = trans;
231 rpt_rel_cache[relation_alias].fields[tabname][colname].aggregate = transform.aggregate;
232 rpt_rel_cache[relation_alias].fields[tabname][colname].params = transform.params;
233 rpt_rel_cache[relation_alias].fields[tabname][colname].transform_label = transform.label;
236 tree.view.selection.select( item_pos );
240 function changeOperator (args) {
242 var active_tab = filterByAttribute(
243 $('used-source-fields-tabbox').getElementsByTagName('tab'),
248 var tabname = active_tab.getAttribute('id');
250 var tabpanel = $( tabname + 'panel' );
251 var tree = tabpanel.getElementsByTagName('tree')[0];
252 var item_pos = tree.view.selection.currentIndex;
253 var item = getSelectedItems(tree)[0];
255 var relation_alias = item.getAttribute('relation');
257 var field = item.firstChild.firstChild;
258 var colname = field.nextSibling.getAttribute('label');
260 rpt_rel_cache[relation_alias].fields[tabname][colname].op = args.op;
261 rpt_rel_cache[relation_alias].fields[tabname][colname].op_label = args.label;
264 tree.view.selection.select( item_pos );
268 function removeTemplateFilterValue () {
270 var active_tab = filterByAttribute(
271 $('used-source-fields-tabbox').getElementsByTagName('tab'),
276 var tabname = active_tab.getAttribute('id');
278 var tabpanel = $( tabname + 'panel' );
279 var tree = tabpanel.getElementsByTagName('tree')[0];
280 var item_pos = tree.view.selection.currentIndex;
281 var items = getSelectedItems(tree);
283 for (var i in items) {
285 var relation_alias = item.getAttribute('relation');
287 var field = item.firstChild.firstChild;
288 var colname = field.nextSibling.getAttribute('label');
290 rpt_rel_cache[relation_alias].fields[tabname][colname].op_value = {};
294 tree.view.selection.select( item_pos );
298 function timestampSetDate (obj, cal, date) {
299 obj.op_value.value = date;
300 obj.op_value.object = cal.date;
301 obj.op_value.label = '"' + date + '"';
309 function changeTemplateFilterValue () {
311 var active_tab = filterByAttribute(
312 $('used-source-fields-tabbox').getElementsByTagName('tab'),
317 var tabname = active_tab.getAttribute('id');
319 var tabpanel = $( tabname + 'panel' );
320 var tree = tabpanel.getElementsByTagName('tree')[0];
321 var items = getSelectedItems(tree);
323 var targetCmd = $( tabname + '_value_action' );
325 targetCmd.menu = null;
326 targetCmd.command = null;
327 targetCmd.oncommand = null;
328 targetCmd.removeEventListener( 'command', __handler_cache, true );
330 for (var i in items) {
332 var relation_alias = item.getAttribute('relation');
334 var field = item.firstChild.firstChild;
335 var colname = field.nextSibling.getAttribute('label');
337 var obj = rpt_rel_cache[relation_alias].fields[tabname][colname]
338 var operation = OILS_RPT_FILTERS[obj.op];
340 switch (obj.datatype) {
342 var cal_popup = $('calendar-widget');
344 while (cal_popup.firstChild) cal_popup.removeChild(cal_popup.lastChild);
345 var calendar = new Calendar(
348 function (cal,date) { return timestampSetDate(obj,cal,date) },
349 function (cal) { cal_popup.hidePopup(); cal.destroy(); return true; }
352 var format = OILS_RPT_TRANSFORMS[obj.transform].cal_format || '%Y-%m-%d';
354 calendar.setDateFormat(format);
355 calendar.create(cal_popup);
357 targetCmd.menu = 'calendar-widget';
363 function __bool_value_event_handler () {
367 // get a reference to the prompt service component.
368 var promptService = Components.classes["@mozilla.org/embedcomp/prompt-service;1"]
369 .getService(Components.interfaces.nsIPromptService);
371 // set the buttons that will appear on the dialog. It should be
372 // a set of constants multiplied by button position constants. In this case,
373 // three buttons appear, Save, Cancel and a custom button.
374 var flags=promptService.BUTTON_TITLE_IS_STRING * promptService.BUTTON_POS_0 +
375 promptService.BUTTON_TITLE_IS_STRING * promptService.BUTTON_POS_1 +
376 promptService.BUTTON_TITLE_CANCEL * promptService.BUTTON_POS_2;
378 // display the dialog box. The flags set above are passed
379 // as the fourth argument. The next three arguments are custom labels used for
380 // the buttons, which are used if BUTTON_TITLE_IS_STRING is assigned to a
381 // particular button. The last two arguments are for an optional check box.
382 answer = promptService.select(
385 "Select the value, or cancel:",
386 2, ["True", "False"], state
390 state = confirm("Click OK for TRUE and Cancel for FALSE.");
391 state ? state = 0 : state = 1;
396 obj.op_value.value = 'f';
397 obj.op_value.label = 'False';
399 obj.op_value.value = 't';
400 obj.op_value.label = 'True';
404 targetCmd.removeEventListener( 'command', __bool_value_event_handler, true );
406 tree.view.selection.select( item_pos );
410 __handler_cache = __bool_value_event_handler;
411 targetCmd.addEventListener( 'command', __bool_value_event_handler, true );
418 var promptstring = "Field does not match one of list (comma separated):";
422 promptstring = "Field value is not between (comma separated):";
426 promptstring = "Field value is between (comma separated):";
430 promptstring = "Field does not match one of list (comma separated):";
434 promptstring = "Field matches one of list (comma separated):";
438 promptstring = "Value " + obj.op_label + ":";
442 function __default_value_event_handler () {
444 if (_v = prompt( promptstring, obj.op_value.value || '' )) {
450 obj.op_value.value = _v.split(/\s*,\s*/);
454 obj.op_value.value = _v;
458 obj.op_value.label = '"' + obj.op_value.value + '"';
461 targetCmd.removeEventListener( 'command', __default_value_event_handler, true );
463 tree.view.selection.select( item_pos );
467 __handler_cache = __default_value_event_handler;
468 targetCmd.addEventListener( 'command', __default_value_event_handler, true );
477 function populateOperatorContext () {
479 var active_tab = filterByAttribute(
480 $('used-source-fields-tabbox').getElementsByTagName('tab'),
485 var tabname = active_tab.getAttribute('id');
487 var tabpanel = $( tabname + 'panel' );
488 var tree = tabpanel.getElementsByTagName('tree')[0];
489 var items = getSelectedItems(tree);
492 for (var i in items) {
494 dtypes.push( item.getAttribute('datatype') );
497 var menu = $(tabname + '_op_menu');
498 while (menu.firstChild) menu.removeChild(menu.lastChild);
500 for (var i in OILS_RPT_FILTERS) {
501 var o = OILS_RPT_FILTERS[i];
505 onmouseup : "changeOperator({op:'"+i+"',label:'"+o.label+"'})"
510 var keys = getKeys(o.labels);
511 for ( var k in keys ) {
513 if ( grep(function(x){return key==x},dtypes).length ) {
516 { label : o.labels[key],
517 onmouseup : "changeOperator({op:'"+i+"',label:'"+o.labels[key]+"'});"
527 function populateTransformContext () {
529 var active_tab = filterByAttribute(
530 $('used-source-fields-tabbox').getElementsByTagName('tab'),
535 var tabname = active_tab.getAttribute('id');
537 var tabpanel = $( tabname + 'panel' );
538 var tree = tabpanel.getElementsByTagName('tree')[0];
539 var items = getSelectedItems(tree);
542 for (var i in items) {
544 var dtype = item.getAttribute('datatype');
545 var item_transforms = getTransforms({ datatype : dtype });
547 for (var j in item_transforms) {
548 transforms[item_transforms[j]] = OILS_RPT_TRANSFORMS[item_transforms[j]];
549 transforms[item_transforms[j]].name = item_transforms[j];
553 var transformList = [];
554 for (var i in transforms) {
555 transformList.push( transforms[i] );
558 transformList.sort( sortHashLabels );
560 var menu = $(tabname + '_trans_menu');
561 while (menu.firstChild) menu.removeChild(menu.lastChild);
563 for (var i in transformList) {
564 var t = transformList[i];
566 if (tabname.match(/filter/)) {
567 if (tabname.match(/^agg/)) {
568 if (!t.aggregate) continue;
570 if (t.aggregate) continue;
576 { aggregate : t.aggregate,
581 onmouseup : "alterColumnTransform('"+t.name+"')"
587 menu.parentNode.setAttribute('disabled','false');
588 if (menu.childNodes.length == 0) {
589 menu.parentNode.setAttribute('disabled','true');
594 function renderSources (selected) {
596 var tree = $('used-sources');
597 var sources = $('used-sources-treetop');
598 var tabs = $('used-source-fields-tabbox').getElementsByTagName('tab');
601 while (sources.firstChild) sources.removeChild(sources.lastChild);
603 selected = getSelectedItems(tree);
604 if (!selected.length) {
605 selected = undefined;
606 while (sources.firstChild) sources.removeChild(sources.lastChild);
610 for (var j = 0; j < tabs.length; j++) {
612 var tabname = tab.getAttribute('id')
613 var tabpanel = $( tab.getAttribute('id') + 'panel' );
614 var fieldtree = tabpanel.getElementsByTagName('treechildren')[0];
616 while (fieldtree.firstChild) fieldtree.removeChild(fieldtree.lastChild);
619 for (var relation_alias in rpt_rel_cache) {
620 if (!rpt_rel_cache[relation_alias].fields) continue;
626 return x.getAttribute('relation') == relation_alias;
633 $('used-sources-treetop').appendChild(
635 { relation : rpt_rel_cache[relation_alias].alias,
636 idlclass : rpt_rel_cache[relation_alias].idlclass,
637 reltype : rpt_rel_cache[relation_alias].reltype,
638 path : rpt_rel_cache[relation_alias].path,
642 createTreeCell({ label : rpt_rel_cache[relation_alias].label }),
643 createTreeCell({ label : rpt_rel_cache[relation_alias].table }),
644 createTreeCell({ label : rpt_rel_cache[relation_alias].alias }),
645 createTreeCell({ label : rpt_rel_cache[relation_alias].reltype })
651 for each (var tabname in ['filter_tab','aggfilter_tab']) {
652 tabpanel = $( tabname + 'panel' );
653 fieldtree = tabpanel.getElementsByTagName('treechildren')[0];
655 for (var colname in rpt_rel_cache[relation_alias].fields[tabname]) {
656 with (rpt_rel_cache[relation_alias].fields[tabname][colname]) {
657 fieldtree.appendChild(
659 { relation : relation_alias, datatype : datatype },
662 createTreeCell({ label : alias }),
663 createTreeCell({ label : colname }),
664 createTreeCell({ label : datatype }),
665 createTreeCell({ label : transform_label }),
666 createTreeCell({ label : transform })
671 fieldtree.lastChild.firstChild.appendChild(
672 createTreeCell({ op : op, label : op_label })
675 if (op_value.value != undefined) {
676 fieldtree.lastChild.firstChild.appendChild(
677 createTreeCell({ label : op_value.label })
685 tabpanel = $( 'dis_tabpanel' );
686 fieldtree = tabpanel.getElementsByTagName('treechildren')[0];
687 for each (var order in rpt_rel_cache.order_by) {
693 return x.getAttribute('relation') == order.relation;
700 with (rpt_rel_cache[order.relation].fields.dis_tab[order.field]) {
701 fieldtree.appendChild(
703 { relation : order.relation, datatype : datatype },
706 createTreeCell({ label : alias }),
707 createTreeCell({ label : colname }),
708 createTreeCell({ label : datatype }),
709 createTreeCell({ label : transform_label }),
710 createTreeCell({ label : transform })
715 fieldtree.lastChild.firstChild.appendChild(
716 createTreeCell({ op : op, label : op_label })
719 if (op_value.value != undefined) {
720 fieldtree.lastChild.firstChild.appendChild(
721 createTreeCell({ label : op_value.label })
731 filter_tab : 'where',
732 aggfilter_tab : 'having',
736 function save_template () {
741 core_class : $('sources-treetop').getElementsByTagName('treeitem')[0].getAttribute('idlclass'),
749 for (var relname in rpt_rel_cache) {
750 var relation = rpt_rel_cache[relname];
751 if (!relation.fields) continue;
753 // first, add the where and having clauses (easier)
754 for each (var tab_name in [ 'filter_tab', 'aggfilter_tab' ]) {
755 var tab = relation.fields[tab_name];
756 for (var field in tab) {
757 fleshTemplateField( template, relation, tab_name, field );
761 // now the from clause
762 fleshFromPath( template, relation );
765 // and now for select (based on order_by)
766 for each (var order in rpt_rel_cache.order_by)
767 fleshTemplateField( template, rpt_rel_cache[order.relation], 'dis_tab', order.field );
769 prompt( 'template', js2JSON( template ) );
771 // and the saving throw ...
773 var session = cgi.param('ses');
774 fetchUser( session );
777 tmpl.name( $('template-name').value );
778 tmpl.description( $('template-description').value );
779 tmpl.owner(USER.id());
780 tmpl.folder(cgi.param('folder'));
781 tmpl.data(js2JSON(template));
783 if(!confirm('Name : '+tmpl.name() + '\nDescription: ' + tmpl.description()+'\nSave Template?'))
786 var req = new Request('open-ils.reporter:open-ils.reporter.template.create', session, tmpl);
787 req.request.alertEvent = false;
790 var res = r.getResultObject();
791 if(checkILSEvent(res)) {
794 if( res && res != '0' ) {
795 confirm('Template ' + tmpl.name() + ' was successfully saved.');
796 _l('../oils_rpt.xhtml');
805 function fleshFromPath ( template, rel ) {
806 var table_path = rel.path.split( /\./ );
807 if (table_path.length > 1 || rel.path.indexOf('-') > -1) table_path.push( rel.idlclass );
811 var current_path = '';
812 var current_obj = template.from;
814 while (link = table_path.shift()) {
815 if (current_path) current_path += '-';
816 current_path += link;
818 var leaf = table_path.length == 0 ? true : false;
820 current_obj.path = current_path;
821 current_obj.table = getIDLClass( link.split(/-/)[0] ).getAttributeNS( persistNS, 'tablename' );
823 if (prev_link != '') {
824 var prev_class = getIDLClass( prev_link.split(/-/)[0] );
825 var prev_field = prev_link.split(/-/)[1];
827 var current_link = getIDLLink( prev_class, prev_field );
828 current_obj.key = current_link.getAttribute('key');
831 current_link.getAttribute('reltype') != 'has_a' ||
832 prev_type == 'left' ||
833 rel.reltype != 'has_a'
834 ) current_obj.type = 'left';
836 prev_type = current_obj.type;
840 current_obj.label = rel.label;
841 current_obj.alias = rel.alias;
842 current_obj.idlclass = rel.idlclass;
843 current_obj.template_path = rel.path;
845 var current_class = getIDLClass( link.split(/-/)[0] );
846 var join_field = link.split(/-/)[1];
847 var join_link = getIDLLink(current_class, join_field);
849 if (join_link.getAttribute('reltype') != 'has_a') {
850 var fields_el = current_class.getElementsByTagName('fields')[0];
851 join_field = fields_el.getAttributeNS(persistNS, 'primary') + '-' + join_link.getAttribute('key');
854 current_obj.alias = hex_md5( current_path ) ;
855 join_field += '-' + current_obj.alias;
856 if (table_path.length == 1) join_field += '-' + rel.alias;
858 if (!current_obj.join) current_obj.join = {};
859 if (!current_obj.join[join_field]) current_obj.join[join_field] = {};
861 if (current_obj.type == 'left') current_obj.join[join_field].type = 'left';
863 current_obj = current_obj.join[join_field];
872 function fleshTemplateField ( template, rel, tab_name, field ) {
874 if (!rel.fields[tab_name] || !rel.fields[tab_name][field]) return;
876 prompt('eh',js2JSON(rel));
878 var tab = rel.fields[tab_name];
880 var table_path = rel.path.split( /\./ );
881 if (table_path.length > 1 || rel.path.indexOf('-') > -1)
882 table_path.push( rel.idlclass );
884 table_path.push( field );
886 var field_path = table_path.join('-');
889 alias : tab[field].alias,
892 transform : tab[field].transform,
893 transform_label : tab[field].transform_label
899 if (tab_name.match(/filter/)) {
900 element.condition = {};
901 element.condition[tab[field].op] =
902 tab[field].op_value.value ?
903 tab[field].op_value.value :
904 '::P' + param_count++;
907 template[tab_use[tab_name]].push(element);