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 item_pos = tree.view.selection.currentIndex;
14 var fields = getSelectedItems(tree);
17 for (var i in fields) {
18 var field = fields[i];
19 var colname = field.firstChild.firstChild.nextSibling.getAttribute('label');
20 var relation_alias = field.getAttribute('relation');
22 delete rpt_rel_cache[relation_alias].fields[tabname][colname];
23 if (tabname == 'dis_tab') {
25 for each (var _o_col in rpt_rel_cache.order_by) {
26 if (_o_col.relation == relation_alias && _o_col.field == colname) continue;
27 _o_tmp.push( _o_col );
29 rpt_rel_cache.order_by = _o_tmp
32 with (rpt_rel_cache[relation_alias].fields) {
33 if ( getKeys(dis_tab).length == 0 && getKeys(filter_tab).length == 0 && getKeys(aggfilter_tab).length == 0 )
34 delete rpt_rel_cache[relation_alias];
39 tree.view.selection.select( item_pos );
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',
132 function changeDisplayOrder (dir) {
133 var active_tab = filterByAttribute(
134 $('used-source-fields-tabbox').getElementsByTagName('tab'),
139 var tabname = active_tab.getAttribute('id');
141 var tabpanel = $( tabname + 'panel' );
142 var tree = tabpanel.getElementsByTagName('tree')[0];
143 var item = getSelectedItems(tree)[0];
145 var item_pos = tree.view.selection.currentIndex;
148 if ( item.previousSibling ) {
149 item.parentNode.insertBefore( item, item.previousSibling );
152 } else if (dir == 'd') {
153 if ( item.nextSibling ) {
154 if (item.nextSibling.nextSibling ) item.parentNode.insertBefore( item, item.nextSibling.nextSibling );
155 else item.parentNode.appendChild( item );
160 rpt_rel_cache.order_by = [];
161 var ordered_list = tree.getElementsByTagName('treeitem');
162 for (var i = 0; i < ordered_list.length; i++) {
163 rpt_rel_cache.order_by.push(
164 { relation : ordered_list[i].getAttribute('relation'),
165 field : ordered_list[i].firstChild.firstChild.nextSibling.getAttribute('label')
170 tree.view.selection.select( item_pos );
173 function alterColumnLabel () {
174 var active_tab = filterByAttribute(
175 $('used-source-fields-tabbox').getElementsByTagName('tab'),
180 var tabname = active_tab.getAttribute('id');
182 var tabpanel = $( tabname + 'panel' );
183 var tree = tabpanel.getElementsByTagName('tree')[0];
184 var item_pos = tree.view.selection.currentIndex;
186 var item = getSelectedItems(tree)[0];
187 var relation_alias = item.getAttribute('relation');
189 var field = item.firstChild.firstChild;
190 var colname = field.nextSibling.getAttribute('label');
192 var new_label = prompt(
193 "Change the column header to:",
194 field.getAttribute("label")
198 rpt_rel_cache[relation_alias].fields[tabname][colname].alias = new_label;
200 tree.view.selection.select( item_pos );
204 function alterColumnTransform (trans) {
206 var transform = OILS_RPT_TRANSFORMS[trans];
208 var active_tab = filterByAttribute(
209 $('used-source-fields-tabbox').getElementsByTagName('tab'),
214 var tabname = active_tab.getAttribute('id');
216 var tabpanel = $( tabname + 'panel' );
217 var tree = tabpanel.getElementsByTagName('tree')[0];
218 var item_pos = tree.view.selection.currentIndex;
219 var item = getSelectedItems(tree)[0];
220 var relation_alias = item.getAttribute('relation');
222 var field = item.firstChild.firstChild;
223 var colname = field.nextSibling.getAttribute('label');
225 rpt_rel_cache[relation_alias].fields[tabname][colname].transform = trans;
226 rpt_rel_cache[relation_alias].fields[tabname][colname].aggregate = transform.aggregate;
227 rpt_rel_cache[relation_alias].fields[tabname][colname].params = transform.params;
228 rpt_rel_cache[relation_alias].fields[tabname][colname].transform_label = transform.label;
231 tree.view.selection.select( item_pos );
235 function changeOperator (args) {
237 var active_tab = filterByAttribute(
238 $('used-source-fields-tabbox').getElementsByTagName('tab'),
243 var tabname = active_tab.getAttribute('id');
245 var tabpanel = $( tabname + 'panel' );
246 var tree = tabpanel.getElementsByTagName('tree')[0];
247 var item_pos = tree.view.selection.currentIndex;
248 var item = getSelectedItems(tree)[0];
250 var relation_alias = item.getAttribute('relation');
252 var field = item.firstChild.firstChild;
253 var colname = field.nextSibling.getAttribute('label');
255 rpt_rel_cache[relation_alias].fields[tabname][colname].op = args.op;
256 rpt_rel_cache[relation_alias].fields[tabname][colname].op_label = args.label;
259 tree.view.selection.select( item_pos );
263 function removeTemplateFilterValue () {
265 var active_tab = filterByAttribute(
266 $('used-source-fields-tabbox').getElementsByTagName('tab'),
271 var tabname = active_tab.getAttribute('id');
273 var tabpanel = $( tabname + 'panel' );
274 var tree = tabpanel.getElementsByTagName('tree')[0];
275 var item_pos = tree.view.selection.currentIndex;
276 var item = getSelectedItems(tree)[0];
277 var relation_alias = item.getAttribute('relation');
279 var field = item.firstChild.firstChild;
280 var colname = field.nextSibling.getAttribute('label');
282 rpt_rel_cache[relation_alias].fields[tabname][colname].op_value = {};
285 tree.view.selection.select( item_pos );
288 function timestampSetDate (obj, cal, date) {
289 obj.op_value.value = date;
290 obj.op_value.object = cal.date;
291 obj.op_value.label = '"' + date + '"';
298 function changeTemplateFilterValue () {
300 var active_tab = filterByAttribute(
301 $('used-source-fields-tabbox').getElementsByTagName('tab'),
306 var tabname = active_tab.getAttribute('id');
308 var tabpanel = $( tabname + 'panel' );
309 var tree = tabpanel.getElementsByTagName('tree')[0];
310 var item_pos = tree.view.selection.currentIndex;
311 var item = getSelectedItems(tree)[0];
313 var targetCmd = $( tabname + '_value_action' );
315 targetCmd.menu = null;
316 targetCmd.command = null;
317 targetCmd.oncommand = null;
318 targetCmd.removeEventListener( 'command', __handler_cache, true );
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 );
394 tree.view.selection.select( item_pos );
397 __handler_cache = __bool_value_event_handler;
398 targetCmd.addEventListener( 'command', __bool_value_event_handler, true );
405 var promptstring = "Field does not match one of list (comma separated):";
409 promptstring = "Field value is not between (comma separated):";
413 promptstring = "Field value is between (comma separated):";
417 promptstring = "Field does not match one of list (comma separated):";
421 promptstring = "Field matches one of list (comma separated):";
425 promptstring = "Value " + obj.op_label + ":";
429 function __default_value_event_handler () {
431 if (_v = prompt( promptstring, obj.op_value.value || '' )) {
437 obj.op_value.value = _v.split(/\s*,\s*/);
441 obj.op_value.value = _v;
445 obj.op_value.label = '"' + obj.op_value.value + '"';
448 targetCmd.removeEventListener( 'command', __default_value_event_handler, true );
450 tree.view.selection.select( item_pos );
453 __handler_cache = __default_value_event_handler;
454 targetCmd.addEventListener( 'command', __default_value_event_handler, true );
460 function populateOperatorContext () {
462 var active_tab = filterByAttribute(
463 $('used-source-fields-tabbox').getElementsByTagName('tab'),
468 var tabname = active_tab.getAttribute('id');
470 var tabpanel = $( tabname + 'panel' );
471 var tree = tabpanel.getElementsByTagName('tree')[0];
472 var items = getSelectedItems(tree);
475 for (var i in items) {
477 dtypes.push( item.getAttribute('datatype') );
480 var menu = $(tabname + '_op_menu');
481 while (menu.firstChild) menu.removeChild(menu.lastChild);
483 for (var i in OILS_RPT_FILTERS) {
484 var o = OILS_RPT_FILTERS[i];
488 oncommand : "changeOperator({op:'"+i+"',label:'"+o.label+"'})",
493 var keys = getKeys(o.labels);
494 for ( var k in keys ) {
496 if ( grep(function(x){return key==x},dtypes).length ) {
499 { label : o.labels[key],
500 oncommand : "changeOperator({op:'"+i+"',label:'"+o.labels[key]+"'})",
510 function populateTransformContext () {
512 var active_tab = filterByAttribute(
513 $('used-source-fields-tabbox').getElementsByTagName('tab'),
518 var tabname = active_tab.getAttribute('id');
520 var tabpanel = $( tabname + 'panel' );
521 var tree = tabpanel.getElementsByTagName('tree')[0];
522 var items = getSelectedItems(tree);
525 for (var i in items) {
527 var dtype = item.getAttribute('datatype');
528 var item_transforms = getTransforms({ datatype : dtype });
530 for (var j in item_transforms) {
531 transforms[item_transforms[j]] = OILS_RPT_TRANSFORMS[item_transforms[j]];
532 transforms[item_transforms[j]].name = item_transforms[j];
536 var transformList = [];
537 for (var i in transforms) {
538 transformList.push( transforms[i] );
541 transformList.sort( sortHashLabels );
543 var menu = $(tabname + '_trans_menu');
544 while (menu.firstChild) menu.removeChild(menu.lastChild);
546 for (var i in transformList) {
547 var t = transformList[i];
549 if (tabname.match(/filter/)) {
550 if (tabname.match(/^agg/)) {
551 if (!t.aggregate) continue;
553 if (t.aggregate) continue;
559 { aggregate : t.aggregate,
564 oncommand : "alterColumnTransform('"+t.name+"')",
570 menu.parentNode.setAttribute('disabled','false');
571 if (menu.childNodes.length == 0) {
572 menu.parentNode.setAttribute('disabled','true');
577 function renderSources (selected) {
579 var tree = $('used-sources');
580 var sources = $('used-sources-treetop');
581 var tabs = $('used-source-fields-tabbox').getElementsByTagName('tab');
584 while (sources.firstChild) sources.removeChild(sources.lastChild);
586 selected = getSelectedItems(tree);
587 if (!selected.length) {
588 selected = undefined;
589 while (sources.firstChild) sources.removeChild(sources.lastChild);
593 for (var j = 0; j < tabs.length; j++) {
595 var tabname = tab.getAttribute('id')
596 var tabpanel = $( tab.getAttribute('id') + 'panel' );
597 var fieldtree = tabpanel.getElementsByTagName('treechildren')[0];
599 while (fieldtree.firstChild) fieldtree.removeChild(fieldtree.lastChild);
602 for (var relation_alias in rpt_rel_cache) {
603 if (!rpt_rel_cache[relation_alias].fields) continue;
609 return x.getAttribute('relation') == relation_alias;
616 $('used-sources-treetop').appendChild(
618 { relation : rpt_rel_cache[relation_alias].alias,
619 idlclass : rpt_rel_cache[relation_alias].idlclass,
620 reltype : rpt_rel_cache[relation_alias].reltype,
621 path : rpt_rel_cache[relation_alias].path,
625 createTreeCell({ label : rpt_rel_cache[relation_alias].label }),
626 createTreeCell({ label : rpt_rel_cache[relation_alias].table }),
627 createTreeCell({ label : rpt_rel_cache[relation_alias].alias }),
628 createTreeCell({ label : rpt_rel_cache[relation_alias].reltype })
634 for each (var tabname in ['filter_tab','aggfilter_tab']) {
635 tabpanel = $( tabname + 'panel' );
636 fieldtree = tabpanel.getElementsByTagName('treechildren')[0];
638 for (var colname in rpt_rel_cache[relation_alias].fields[tabname]) {
639 with (rpt_rel_cache[relation_alias].fields[tabname][colname]) {
640 fieldtree.appendChild(
642 { relation : relation_alias, datatype : datatype },
645 createTreeCell({ label : alias }),
646 createTreeCell({ label : colname }),
647 createTreeCell({ label : datatype }),
648 createTreeCell({ label : transform_label }),
649 createTreeCell({ label : transform })
654 fieldtree.lastChild.firstChild.appendChild(
655 createTreeCell({ op : op, label : op_label })
658 if (op_value.value != undefined) {
659 fieldtree.lastChild.firstChild.appendChild(
660 createTreeCell({ label : op_value.label })
668 tabpanel = $( 'dis_tabpanel' );
669 fieldtree = tabpanel.getElementsByTagName('treechildren')[0];
670 for each (var order in rpt_rel_cache.order_by) {
676 return x.getAttribute('relation') == order.relation;
683 with (rpt_rel_cache[order.relation].fields.dis_tab[order.field]) {
684 fieldtree.appendChild(
686 { relation : order.relation, datatype : datatype },
689 createTreeCell({ label : alias }),
690 createTreeCell({ label : colname }),
691 createTreeCell({ label : datatype }),
692 createTreeCell({ label : transform_label }),
693 createTreeCell({ label : transform })
698 fieldtree.lastChild.firstChild.appendChild(
699 createTreeCell({ op : op, label : op_label })
702 if (op_value.value != undefined) {
703 fieldtree.lastChild.firstChild.appendChild(
704 createTreeCell({ label : op_value.label })
714 filter_tab : 'where',
715 aggfilter_tab : 'having',
719 function save_template () {
724 core_class : $('sources-treetop').getElementsByTagName('treeitem')[0].getAttribute('idlclass'),
732 for (var relname in rpt_rel_cache) {
733 var relation = rpt_rel_cache[relname];
734 if (!relation.fields) continue;
736 // first, add the where and having clauses (easier)
737 for each (var tab_name in [ 'filter_tab', 'aggfilter_tab' ]) {
738 var tab = relation.fields[tab_name];
739 for (var field in tab) {
740 fleshTemplateField( template, relation, tab_name, field );
744 // now the from clause
745 fleshFromPath( template, relation );
748 // and now for select (based on order_by)
749 for each (var order in rpt_rel_cache.order_by)
750 fleshTemplateField( template, rpt_rel_cache[order.relation], 'dis_tab', order.field );
753 // and the saving throw ...
755 var session = cgi.param('ses');
756 fetchUser( session );
759 tmpl.name( $('template-name').value );
760 tmpl.description( $('template-description').value );
761 tmpl.owner(USER.id());
762 tmpl.folder(cgi.param('folder'));
763 tmpl.data(js2JSON(template));
765 // prompt( 'template', js2JSON( tmpl ) );
767 if(!confirm('Name : '+tmpl.name() + '\nDescription: ' + tmpl.description()+'\nSave Template?'))
770 var req = new Request('open-ils.reporter:open-ils.reporter.template.create', session, tmpl);
771 req.request.alertEvent = false;
774 var res = r.getResultObject();
775 if(checkILSEvent(res)) {
778 if( res && res != '0' ) {
779 confirm('Template ' + tmpl.name() + ' was successfully saved.');
780 _l('../oils_rpt.xhtml');
789 function fleshFromPath ( template, rel ) {
790 var table_path = rel.path.split( /\./ );
791 if (table_path.length > 1 || rel.path.indexOf('-') > -1) table_path.push( rel.idlclass );
795 var current_path = '';
796 var current_obj = template.from;
798 while (link = table_path.shift()) {
799 if (current_path) current_path += '-';
800 current_path += link;
802 var leaf = table_path.length == 0 ? true : false;
804 current_obj.path = current_path;
805 current_obj.table = getIDLClass( link.split(/-/)[0] ).getAttributeNS( persistNS, 'tablename' );
807 if (prev_link != '') {
808 var prev_class = getIDLClass( prev_link.split(/-/)[0] );
809 var prev_field = prev_link.split(/-/)[1];
811 var current_link = getIDLLink( prev_class, prev_field );
812 current_obj.key = current_link.getAttribute('key');
815 current_link.getAttribute('reltype') != 'has_a' ||
816 prev_type == 'left' ||
817 rel.reltype != 'has_a'
818 ) current_obj.type = 'left';
820 prev_type = current_obj.type;
824 current_obj.label = rel.label;
825 current_obj.alias = rel.alias;
826 current_obj.idlclass = rel.idlclass;
827 current_obj.template_path = rel.path;
829 var current_class = getIDLClass( link.split(/-/)[0] );
830 var join_field = link.split(/-/)[1];
831 var join_link = getIDLLink(current_class, join_field);
833 if (join_link.getAttribute('reltype') != 'has_a') {
834 var fields_el = current_class.getElementsByTagName('fields')[0];
835 join_field = fields_el.getAttributeNS(persistNS, 'primary') + '-' + join_link.getAttribute('key');
838 current_obj.alias = hex_md5( current_path ) ;
839 join_field += '-' + current_obj.alias;
840 if (table_path.length == 1) join_field += '-' + rel.alias;
842 if (!current_obj.join) current_obj.join = {};
843 if (!current_obj.join[join_field]) current_obj.join[join_field] = {};
845 if (current_obj.type == 'left') current_obj.join[join_field].type = 'left';
847 current_obj = current_obj.join[join_field];
856 function fleshTemplateField ( template, rel, tab_name, field ) {
858 if (!rel.fields[tab_name] || !rel.fields[tab_name][field]) return;
860 var tab = rel.fields[tab_name];
862 var field_path = rel.path + '-' + field;
863 field_path = field_path.replace(/\./g, '-');
866 alias : tab[field].alias,
869 transform : tab[field].transform,
870 transform_label : tab[field].transform_label
876 if (tab_name.match(/filter/)) {
877 element.condition = {};
878 element.condition[tab[field].op] =
879 tab[field].op_value.value ?
880 tab[field].op_value.value :
881 '::P' + param_count++;
884 template[tab_use[tab_name]].push(element);