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];
40 function addReportAtoms () {
41 var nope = $( 'source-add' ).getAttribute('disabled');
42 if (nope == 'true') return false;
44 var class_tree = $('class-view');
45 var transform_tree = $('trans-view');
47 var active_tab = filterByAttribute(
48 $('used-source-fields-tabbox').getElementsByTagName('tab'),
53 var tabname = active_tab.getAttribute('id')
55 var items = getSelectedItems(class_tree);
56 var transform = getSelectedItems(transform_tree)[0];
58 var reltype = $('path-label').getAttribute('reltype');
59 var class_label = $('path-label').value;
60 var relation_alias = hex_md5(class_label);
62 for (var i in items) {
65 var class_path = item.getAttribute('fullpath');
66 var field_class = item.getAttribute('idlclass');
67 var datatype = item.getAttribute('datatype');
68 var colname = item.getAttribute('idlfield');
69 var field_label = item.firstChild.firstChild.getAttribute('label');
71 var table_name = getIDLClass(field_class).getAttributeNS(persistNS,'tablename');
73 if ( !rpt_rel_cache[relation_alias] ) {
74 rpt_rel_cache[relation_alias] =
75 { label : class_label,
76 alias : relation_alias,
79 idlclass : field_class,
81 fields: { dis_tab : {}, filter_tab : {}, aggfilter_tab : {} }
85 if ( !rpt_rel_cache[relation_alias].fields[tabname][colname] ) {
86 rpt_rel_cache[relation_alias].fields[tabname][colname] =
88 transform : (transform && transform.getAttribute('name')) || 'Bare',
89 aggregate : transform && transform.getAttribute('aggregate'),
90 params : transform && transform.getAttribute('params'),
91 transform_label: (transform && transform.getAttribute('alias')) || 'Raw Data',
99 if (!rpt_rel_cache.order_by)
100 rpt_rel_cache.order_by = [];
102 if (tabname == 'dis_tab')
103 rpt_rel_cache.order_by.push( { relation : relation_alias, field : colname } );
107 'You have already added the [' + field_label +
108 '] field\nfrom the [' + class_label + '] source. Click OK if you\nwould like ' +
109 'to reset this field.'
112 rpt_rel_cache[relation_alias].fields[tabname][colname] =
114 transform : (transform && transform.getAttribute('name')) || 'Bare',
115 aggregate : transform && transform.getAttribute('aggregate'),
116 params : transform && transform.getAttribute('params'),
117 transform_label: (transform && transform.getAttribute('alias')) || 'Raw Data',
130 function changeDisplayOrder (dir) {
131 var active_tab = filterByAttribute(
132 $('used-source-fields-tabbox').getElementsByTagName('tab'),
137 var tabname = active_tab.getAttribute('id');
139 var tabpanel = $( tabname + 'panel' );
140 var tree = tabpanel.getElementsByTagName('tree')[0];
141 var item = getSelectedItems(tree)[0];
143 var item_pos = tree.view.selection.currentIndex;
146 if ( item.previousSibling ) {
147 item.parentNode.insertBefore( item, item.previousSibling );
150 } else if (dir == 'd') {
151 if ( item.nextSibling ) {
152 if (item.nextSibling.nextSibling ) item.parentNode.insertBefore( item, item.nextSibling.nextSibling );
153 else item.parentNode.appendChild( item );
158 rpt_rel_cache.order_by = [];
159 var ordered_list = tree.getElementsByTagName('treeitem');
160 for (var i = 0; i < ordered_list.length; i++) {
161 rpt_rel_cache.order_by.push(
162 { relation : ordered_list[i].getAttribute('relation'),
163 field : ordered_list[i].firstChild.firstChild.nextSibling.getAttribute('label')
168 tree.view.selection.select( item_pos );
171 function alterColumnLabel () {
172 var active_tab = filterByAttribute(
173 $('used-source-fields-tabbox').getElementsByTagName('tab'),
178 var tabname = active_tab.getAttribute('id');
180 var tabpanel = $( tabname + 'panel' );
181 var tree = tabpanel.getElementsByTagName('tree')[0];
182 var items = getSelectedItems(tree);
184 for (var i in items) {
186 var relation_alias = item.getAttribute('relation');
188 var field = item.firstChild.firstChild;
189 var colname = field.nextSibling.getAttribute('label');
191 var new_label = prompt(
192 "Change the column header to:",
193 field.getAttribute("label")
197 rpt_rel_cache[relation_alias].fields[tabname][colname].alias = new_label;
203 function alterColumnTransform (trans) {
205 var transform = OILS_RPT_TRANSFORMS[trans];
207 var active_tab = filterByAttribute(
208 $('used-source-fields-tabbox').getElementsByTagName('tab'),
213 var tabname = active_tab.getAttribute('id');
215 var tabpanel = $( tabname + 'panel' );
216 var tree = tabpanel.getElementsByTagName('tree')[0];
217 var items = getSelectedItems(tree);
219 for (var i in items) {
221 var relation_alias = item.getAttribute('relation');
223 var field = item.firstChild.firstChild;
224 var colname = field.nextSibling.getAttribute('label');
226 rpt_rel_cache[relation_alias].fields[tabname][colname].transform = trans;
227 rpt_rel_cache[relation_alias].fields[tabname][colname].aggregate = transform.aggregate;
228 rpt_rel_cache[relation_alias].fields[tabname][colname].params = transform.params;
229 rpt_rel_cache[relation_alias].fields[tabname][colname].transform_label = transform.label;
237 function changeOperator (args) {
239 var active_tab = filterByAttribute(
240 $('used-source-fields-tabbox').getElementsByTagName('tab'),
245 var tabname = active_tab.getAttribute('id');
247 var tabpanel = $( tabname + 'panel' );
248 var tree = tabpanel.getElementsByTagName('tree')[0];
249 var items = getSelectedItems(tree);
251 for (var i in items) {
253 var relation_alias = item.getAttribute('relation');
255 var field = item.firstChild.firstChild;
256 var colname = field.nextSibling.getAttribute('label');
258 rpt_rel_cache[relation_alias].fields[tabname][colname].op = args.op;
259 rpt_rel_cache[relation_alias].fields[tabname][colname].op_label = args.label;
267 function removeTemplateFilterValue () {
269 var active_tab = filterByAttribute(
270 $('used-source-fields-tabbox').getElementsByTagName('tab'),
275 var tabname = active_tab.getAttribute('id');
277 var tabpanel = $( tabname + 'panel' );
278 var tree = tabpanel.getElementsByTagName('tree')[0];
279 var items = getSelectedItems(tree);
281 for (var i in items) {
283 var relation_alias = item.getAttribute('relation');
285 var field = item.firstChild.firstChild;
286 var colname = field.nextSibling.getAttribute('label');
288 rpt_rel_cache[relation_alias].fields[tabname][colname].op_value = {};
294 function timestampSetDate (obj, cal, date) {
295 obj.op_value.value = date;
296 obj.op_value.object = cal.date;
297 obj.op_value.label = '"' + date + '"';
304 function changeTemplateFilterValue () {
306 var active_tab = filterByAttribute(
307 $('used-source-fields-tabbox').getElementsByTagName('tab'),
312 var tabname = active_tab.getAttribute('id');
314 var tabpanel = $( tabname + 'panel' );
315 var tree = tabpanel.getElementsByTagName('tree')[0];
316 var items = getSelectedItems(tree);
318 var targetCmd = $( tabname + '_value_action' );
320 targetCmd.menu = null;
321 targetCmd.command = null;
322 targetCmd.oncommand = null;
323 targetCmd.removeEventListener( 'command', __handler_cache, true );
325 for (var i in items) {
327 var relation_alias = item.getAttribute('relation');
329 var field = item.firstChild.firstChild;
330 var colname = field.nextSibling.getAttribute('label');
332 var obj = rpt_rel_cache[relation_alias].fields[tabname][colname]
333 var operation = OILS_RPT_FILTERS[obj.op];
335 switch (obj.datatype) {
337 var cal_popup = $('calendar-widget');
339 while (cal_popup.firstChild) cal_popup.removeChild(cal_popup.lastChild);
340 var calendar = new Calendar(
343 function (cal,date) { timestampSetDate(obj,cal,date) },
344 function (cal) { cal_popup.hidePopup(); cal.destroy(); }
347 var format = OILS_RPT_TRANSFORMS[obj.transform].cal_format || '%Y-%m-%d';
349 calendar.setDateFormat(format);
350 calendar.create(cal_popup);
352 targetCmd.menu = 'calendar-widget';
358 function __bool_value_event_handler () {
362 // get a reference to the prompt service component.
363 var promptService = Components.classes["@mozilla.org/embedcomp/prompt-service;1"]
364 .getService(Components.interfaces.nsIPromptService);
366 // set the buttons that will appear on the dialog. It should be
367 // a set of constants multiplied by button position constants. In this case,
368 // three buttons appear, Save, Cancel and a custom button.
369 var flags=promptService.BUTTON_TITLE_IS_STRING * promptService.BUTTON_POS_0 +
370 promptService.BUTTON_TITLE_IS_STRING * promptService.BUTTON_POS_1 +
371 promptService.BUTTON_TITLE_CANCEL * promptService.BUTTON_POS_2;
373 // display the dialog box. The flags set above are passed
374 // as the fourth argument. The next three arguments are custom labels used for
375 // the buttons, which are used if BUTTON_TITLE_IS_STRING is assigned to a
376 // particular button. The last two arguments are for an optional check box.
377 answer = promptService.select(
380 "Select the value, or cancel:",
381 2, ["True", "False"], state
385 state = confirm("Click OK for TRUE and Cancel for FALSE.");
386 state ? state = 0 : state = 1;
391 obj.op_value.value = 'f';
392 obj.op_value.label = 'False';
394 obj.op_value.value = 't';
395 obj.op_value.label = 'True';
399 targetCmd.removeEventListener( 'command', __bool_value_event_handler, true );
403 __handler_cache = __bool_value_event_handler;
404 targetCmd.addEventListener( 'command', __bool_value_event_handler, true );
411 var promptstring = "Field does not match one of list (comma separated):";
415 promptstring = "Field value is not between (comma separated):";
419 promptstring = "Field value is between (comma separated):";
423 promptstring = "Field does not match one of list (comma separated):";
427 promptstring = "Field matches one of list (comma separated):";
431 promptstring = "Value " + obj.op_label + ":";
435 function __default_value_event_handler () {
437 if (_v = prompt( promptstring, obj.op_value.value || '' )) {
443 obj.op_value.value = _v.split(/\s*,\s*/);
447 obj.op_value.value = _v;
451 obj.op_value.label = '"' + obj.op_value.value + '"';
454 targetCmd.removeEventListener( 'command', __default_value_event_handler, true );
458 __handler_cache = __default_value_event_handler;
459 targetCmd.addEventListener( 'command', __default_value_event_handler, true );
465 //renderSources(true);
468 function populateOperatorContext () {
470 var active_tab = filterByAttribute(
471 $('used-source-fields-tabbox').getElementsByTagName('tab'),
476 var tabname = active_tab.getAttribute('id');
478 var tabpanel = $( tabname + 'panel' );
479 var tree = tabpanel.getElementsByTagName('tree')[0];
480 var items = getSelectedItems(tree);
483 for (var i in items) {
485 dtypes.push( item.getAttribute('datatype') );
488 var menu = $(tabname + '_op_menu');
489 while (menu.firstChild) menu.removeChild(menu.lastChild);
491 for (var i in OILS_RPT_FILTERS) {
492 var o = OILS_RPT_FILTERS[i];
496 oncommand : "changeOperator({op:'"+i+"',label:'"+o.label+"'})",
501 var keys = getKeys(o.labels);
502 for ( var k in keys ) {
504 if ( grep(function(x){return key==x},dtypes).length ) {
507 { label : o.labels[key],
508 oncommand : "changeOperator({op:'"+i+"',label:'"+o.labels[key]+"'})",
518 function populateTransformContext () {
520 var active_tab = filterByAttribute(
521 $('used-source-fields-tabbox').getElementsByTagName('tab'),
526 var tabname = active_tab.getAttribute('id');
528 var tabpanel = $( tabname + 'panel' );
529 var tree = tabpanel.getElementsByTagName('tree')[0];
530 var items = getSelectedItems(tree);
533 for (var i in items) {
535 var dtype = item.getAttribute('datatype');
536 var item_transforms = getTransforms({ datatype : dtype });
538 for (var j in item_transforms) {
539 transforms[item_transforms[j]] = OILS_RPT_TRANSFORMS[item_transforms[j]];
540 transforms[item_transforms[j]].name = item_transforms[j];
544 var transformList = [];
545 for (var i in transforms) {
546 transformList.push( transforms[i] );
549 transformList.sort( sortHashLabels );
551 var menu = $(tabname + '_trans_menu');
552 while (menu.firstChild) menu.removeChild(menu.lastChild);
554 for (var i in transformList) {
555 var t = transformList[i];
557 if (tabname.match(/filter/)) {
558 if (tabname.match(/^agg/)) {
559 if (!t.aggregate) continue;
561 if (t.aggregate) continue;
567 { aggregate : t.aggregate,
572 oncommand : "alterColumnTransform('"+t.name+"')",
578 menu.parentNode.setAttribute('disabled','false');
579 if (menu.childNodes.length == 0) {
580 menu.parentNode.setAttribute('disabled','true');
585 function renderSources (selected) {
587 var tree = $('used-sources');
588 var sources = $('used-sources-treetop');
589 var tabs = $('used-source-fields-tabbox').getElementsByTagName('tab');
592 while (sources.firstChild) sources.removeChild(sources.lastChild);
594 selected = getSelectedItems(tree);
595 if (!selected.length) {
596 selected = undefined;
597 while (sources.firstChild) sources.removeChild(sources.lastChild);
601 for (var j = 0; j < tabs.length; j++) {
603 var tabname = tab.getAttribute('id')
604 var tabpanel = $( tab.getAttribute('id') + 'panel' );
605 var fieldtree = tabpanel.getElementsByTagName('treechildren')[0];
607 while (fieldtree.firstChild) fieldtree.removeChild(fieldtree.lastChild);
610 for (var relation_alias in rpt_rel_cache) {
611 if (!rpt_rel_cache[relation_alias].fields) continue;
617 return x.getAttribute('relation') == relation_alias;
624 $('used-sources-treetop').appendChild(
626 { relation : rpt_rel_cache[relation_alias].alias,
627 idlclass : rpt_rel_cache[relation_alias].idlclass,
628 reltype : rpt_rel_cache[relation_alias].reltype,
629 path : rpt_rel_cache[relation_alias].path,
633 createTreeCell({ label : rpt_rel_cache[relation_alias].label }),
634 createTreeCell({ label : rpt_rel_cache[relation_alias].table }),
635 createTreeCell({ label : rpt_rel_cache[relation_alias].alias }),
636 createTreeCell({ label : rpt_rel_cache[relation_alias].reltype })
642 for each (var tabname in ['filter_tab','aggfilter_tab']) {
643 tabpanel = $( tabname + 'panel' );
644 fieldtree = tabpanel.getElementsByTagName('treechildren')[0];
646 for (var colname in rpt_rel_cache[relation_alias].fields[tabname]) {
647 with (rpt_rel_cache[relation_alias].fields[tabname][colname]) {
648 fieldtree.appendChild(
650 { relation : relation_alias, datatype : datatype },
653 createTreeCell({ label : alias }),
654 createTreeCell({ label : colname }),
655 createTreeCell({ label : datatype }),
656 createTreeCell({ label : transform_label }),
657 createTreeCell({ label : transform })
662 fieldtree.lastChild.firstChild.appendChild(
663 createTreeCell({ op : op, label : op_label })
666 if (op_value.value != undefined) {
667 fieldtree.lastChild.firstChild.appendChild(
668 createTreeCell({ label : op_value.label })
676 tabpanel = $( 'dis_tabpanel' );
677 fieldtree = tabpanel.getElementsByTagName('treechildren')[0];
678 for each (var order in rpt_rel_cache.order_by) {
684 return x.getAttribute('relation') == order.relation;
691 with (rpt_rel_cache[order.relation].fields.dis_tab[order.field]) {
692 fieldtree.appendChild(
694 { relation : order.relation, datatype : datatype },
697 createTreeCell({ label : alias }),
698 createTreeCell({ label : colname }),
699 createTreeCell({ label : datatype }),
700 createTreeCell({ label : transform_label }),
701 createTreeCell({ label : transform })
706 fieldtree.lastChild.firstChild.appendChild(
707 createTreeCell({ op : op, label : op_label })
710 if (op_value.value != undefined) {
711 fieldtree.lastChild.firstChild.appendChild(
712 createTreeCell({ label : op_value.label })
722 filter_tab : 'where',
723 aggfilter_tab : 'having',
727 function save_template () {
732 core_class : $('sources-treetop').getElementsByTagName('treeitem')[0].getAttribute('idlclass'),
740 for (var relname in rpt_rel_cache) {
741 var relation = rpt_rel_cache[relname];
742 if (!relation.fields) continue;
744 // first, add the where and having clauses (easier)
745 for each (var tab_name in [ 'filter_tab', 'aggfilter_tab' ]) {
746 var tab = relation.fields[tab_name];
747 for (var field in tab) {
748 fleshTemplateField( template, relation, tab_name, field );
752 // now the from clause
753 fleshFromPath( template, relation );
756 // and now for select (based on order_by)
757 for each (var order in rpt_rel_cache.order_by)
758 fleshTemplateField( template, rpt_rel_cache[order.relation], 'dis_tab', order.field );
761 // and the saving throw ...
763 var session = cgi.param('ses');
764 fetchUser( session );
767 tmpl.name( $('template-name').value );
768 tmpl.description( $('template-description').value );
769 tmpl.owner(USER.id());
770 tmpl.folder(cgi.param('folder'));
771 tmpl.data(js2JSON(template));
773 prompt( 'template', js2JSON( tmpl ) );
775 if(!confirm('Name : '+tmpl.name() + '\nDescription: ' + tmpl.description()+'\nSave Template?'))
778 var req = new Request('open-ils.reporter:open-ils.reporter.template.create', session, tmpl);
779 req.request.alertEvent = false;
782 var res = r.getResultObject();
783 if(checkILSEvent(res)) {
786 if( res && res != '0' ) {
787 confirm('Template ' + tmpl.name() + ' was successfully saved.');
788 _l('../oils_rpt.xhtml');
797 function fleshFromPath ( template, rel ) {
798 var table_path = rel.path.split( /\./ );
799 if (table_path.length > 1 || rel.path.indexOf('-') > -1) table_path.push( rel.idlclass );
803 var current_path = '';
804 var current_obj = template.from;
806 while (link = table_path.shift()) {
807 if (current_path) current_path += '-';
808 current_path += link;
810 var leaf = table_path.length == 0 ? true : false;
812 current_obj.path = current_path;
813 current_obj.table = getIDLClass( link.split(/-/)[0] ).getAttributeNS( persistNS, 'tablename' );
815 if (prev_link != '') {
816 var prev_class = getIDLClass( prev_link.split(/-/)[0] );
817 var prev_field = prev_link.split(/-/)[1];
819 var current_link = getIDLLink( prev_class, prev_field );
820 current_obj.key = current_link.getAttribute('key');
823 current_link.getAttribute('reltype') != 'has_a' ||
824 prev_type == 'left' ||
825 rel.reltype != 'has_a'
826 ) current_obj.type = 'left';
828 prev_type = current_obj.type;
832 current_obj.label = rel.label;
833 current_obj.alias = rel.alias;
834 current_obj.idlclass = rel.idlclass;
835 current_obj.template_path = rel.path;
837 var current_class = getIDLClass( link.split(/-/)[0] );
838 var join_field = link.split(/-/)[1];
839 var join_link = getIDLLink(current_class, join_field);
841 if (join_link.getAttribute('reltype') != 'has_a') {
842 var fields_el = current_class.getElementsByTagName('fields')[0];
843 join_field = fields_el.getAttributeNS(persistNS, 'primary') + '-' + join_link.getAttribute('key');
846 current_obj.alias = hex_md5( current_path ) ;
847 join_field += '-' + current_obj.alias;
848 if (table_path.length == 1) join_field += '-' + rel.alias;
850 if (!current_obj.join) current_obj.join = {};
851 if (!current_obj.join[join_field]) current_obj.join[join_field] = {};
853 if (current_obj.type == 'left') current_obj.join[join_field].type = 'left';
855 current_obj = current_obj.join[join_field];
864 function fleshTemplateField ( template, rel, tab_name, field ) {
866 if (!rel.fields[tab_name] || !rel.fields[tab_name][field]) return;
868 var tab = rel.fields[tab_name];
870 var field_path = rel.path + '-' + field;
871 field_path = field_path.replace(/\./g, '-');
874 alias : tab[field].alias,
877 transform : tab[field].transform,
878 transform_label : tab[field].transform_label
884 if (tab_name.match(/filter/)) {
885 element.condition = {};
886 element.condition[tab[field].op] =
887 tab[field].op_value.value ?
888 tab[field].op_value.value :
889 '::P' + param_count++;
892 template[tab_use[tab_name]].push(element);