1 dojo.requireLocalization("openils.reports", "reports");
3 var rpt_strings = dojo.i18n.getLocalization("openils.reports", "reports");
4 var NG_NEW_TEMPLATE_INTERFACE = '/eg/staff/reporter/template/new';
5 var NG_CLONE_TEMPLATE_INTERFACE = '/eg/staff/reporter/template/clone';
6 var NG_CLONE_LEGACY_TEMPLATE_INTERFACE = '/eg/staff/reporter/legacy/template/clone';
7 var OILS_TEMPLATE_INTERFACE = 'xul/template_builder.xul';
8 var OILS_LEGACY_TEMPLATE_INTERFACE = 'oils_rpt_builder.xhtml';
11 /* generic folder window class */
12 oilsRptSetSubClass('oilsRptFolderWindow', 'oilsRptObject');
13 function oilsRptFolderWindow(type, folderId) {
15 var node = oilsRptCurrentFolderManager.findNode(type, folderId);
16 this.selector = DOM.oils_rpt_folder_contents_selector;
17 this.folderNode = node;
19 this.folderId = folderId;
20 oilsRptFolderWindow.folderIdMap[folderId] = this;
23 // maps folder IDs to their containing oilsRptFolderWindow objects
24 oilsRptFolderWindow.folderIdMap = {};
26 oilsRptFolderWindow.prototype.draw = function() {
28 _debug('drawing folder window for ' + this.folderNode.folder.name() );
31 setSelector(DOM.oils_rpt_output_limit_selector, oilsRptOutputLimit);
32 setSelector(DOM.oils_rpt_output_limit_selector_2, oilsRptOutputLimit2);
34 DOM.oils_rpt_output_limit_selector.onchange = function() {
35 oilsRptOutputLimit = getSelectorVal(DOM.oils_rpt_output_limit_selector);
39 DOM.oils_rpt_output_limit_selector_2.onchange = function() {
40 oilsRptOutputLimit2 = getSelectorVal(DOM.oils_rpt_output_limit_selector_2);
44 var mine = ( this.folderNode.folder.owner().id() == USER.id() );
46 _debug('drawing folder window with type '+this.type);
47 if(mine) _debug('folder is mine...');
49 if( mine && this.type == 'template')
50 unHideMe(DOM.oils_rpt_folder_window_contents_new_template.parentNode);
51 else hideMe(DOM.oils_rpt_folder_window_contents_new_template.parentNode);
53 unHideMe(DOM.oils_rpt_folder_window_contents_div);
54 hideMe(DOM.oils_rpt_folder_manager_div);
55 hideMe(DOM.oils_rpt_top_folder);
57 DOM.oils_rpt_folder_window_manage_tab.onclick = function() {
58 unHideMe(DOM.oils_rpt_folder_window_contents_div);
59 hideMe(DOM.oils_rpt_folder_manager_div);
61 DOM.oils_rpt_folder_window_edit_tab.onclick = function() {
62 hideMe(DOM.oils_rpt_folder_window_contents_div);
63 unHideMe(DOM.oils_rpt_folder_manager_div);
66 this.setFolderEditActions();
68 hideMe(DOM.oils_rpt_template_folder_new_report);
69 unHideMe(DOM.oils_rpt_folder_table_right_td);
70 hideMe(DOM.oils_rpt_folder_table_alt_td);
71 this.drawFolderDetails();
73 DOM.oils_rpt_folder_content_action_go.onclick =
74 function() {obj.doFolderAction()}
76 this.fetchFolderData();
78 var sel = DOM.oils_rpt_folder_contents_action_selector;
80 for( var i = 0; i < sel.options.length; i++ ) {
81 var opt = sel.options[i];
83 if( !mine && opt.getAttribute('value').match(/move/) ) {
88 if( opt.getAttribute('type') == this.type ) {
89 if(x && !opt.disabled) {
97 this.drawEditActions();
99 var porg = PERMS.SHARE_REPORT_FOLDER;
101 DOM.oils_rpt_folder_manager_share_opt.disabled = true;
104 oilsRptFolderWindow.prototype.drawEditActions = function() {
106 DOM.oils_rpt_folder_window_contents_new_template.onclick = function() {
107 var s = location.search+'';
108 s = s.replace(/\&folder=\d+/g,'');
109 s = s.replace(/\&ct=\d+/g,'');
110 if (window.IAMBROWSER) {
111 window.top.location.href = NG_NEW_TEMPLATE_INTERFACE+'/'+obj.folderNode.folder.id();
113 goTo( OILS_TEMPLATE_INTERFACE+s+'&folder='+obj.folderNode.folder.id());
118 if( this.folderNode.folder.owner().id() != USER.id() )
119 hideMe(DOM.oils_rpt_folder_manager_tab_table);
121 unHideMe(DOM.oils_rpt_folder_manager_tab_table);
123 if( isTrue(this.folderNode.folder.shared())) {
124 DOM.oils_rpt_folder_manager_share_opt.disabled = true;
125 DOM.oils_rpt_folder_manager_unshare_opt.disabled = false;
127 DOM.oils_rpt_folder_manager_share_opt.disabled = false;
128 DOM.oils_rpt_folder_manager_unshare_opt.disabled = true;
131 this.hideFolderActions();
134 DOM.oils_rpt_folder_manager_actions_submit.onclick = function() {
135 var act = getSelectorVal(DOM.oils_rpt_folder_manager_actions);
136 _debug("doing folder action: " + act);
137 obj.hideFolderActions();
140 unHideMe(DOM.oils_rpt_folder_manager_change_name_div);
142 case 'create_sub_folder':
143 var porg = PERMS.SHARE_REPORT_FOLDER;
145 DOM.oils_rpt_folder_manager_sub_shared.disabled = true;
146 removeChildren(DOM.oils_rpt_folder_manager_sub_lib_picker);
147 unHideMe(DOM.oils_rpt_folder_manager_create_sub);
148 obj.myOrgSelector = new oilsRptMyOrgsWidget(
149 DOM.oils_rpt_folder_manager_sub_lib_picker, USER.ws_ou(), porg)
150 obj.myOrgSelector.draw();
153 obj.doFolderDelete();
167 oilsRptFolderWindow.prototype.shareFolder = function() {
168 var folder = this.folderNode.folder;
169 if(isTrue(folder.shared()))
170 return alertId('oils_rpt_folder_already_shared');
171 unHideMe(DOM.oils_rpt_folder_manager_share_div);
174 var orgsel = new oilsRptMyOrgsWidget(
175 DOM.oils_rpt_folder_manager_share_lib_picker,
176 USER.ws_ou(), PERMS.SHARE_REPORT_FOLDER);
179 var type = this.type;
180 DOM.oils_rpt_folder_manager_share_submit.onclick = function() {
182 folder.share_with(orgsel.getValue());
183 oilsRptUpdateFolder( folder, type,
186 oilsRptAlertSuccess();
187 oilsRptCurrentFolderManager.draw();
194 oilsRptFolderWindow.prototype.unShareFolder = function() {
195 var folder = this.folderNode.folder;
196 if(!isTrue(folder.shared()))
197 return alertId('oils_rpt_folder_already_unshared');
198 if(!confirmId('oils_rpt_folder_unshare_confirm')) return;
200 var type = this.type;
201 oilsRptUpdateFolder( folder, type,
204 oilsRptAlertSuccess();
205 oilsRptCurrentFolderManager.draw();
212 oilsRptFolderWindow.prototype.hideFolderActions = function() {
213 hideMe(DOM.oils_rpt_folder_manager_change_name_div);
214 hideMe(DOM.oils_rpt_folder_manager_create_sub);
215 hideMe(DOM.oils_rpt_folder_manager_share_div);
219 oilsRptFolderWindow.prototype.doFolderAction = function() {
220 var objs = (this.fmTable) ? this.fmTable.getSelected() : [];
222 if( this.type == 'output' && this.fmTable2 )
223 objs = objs.concat( this.fmTable2.getSelected() );
225 if( objs.length == 0 )
226 return alert(rpt_strings.FOLDER_WINDOW_SELECT_ITEM);
227 var action = getSelectorVal(DOM.oils_rpt_folder_contents_action_selector);
230 var successCallback = function(errid) {
231 if(errid) alertId(errid)
232 else oilsRptAlertSuccess();
239 case 'create_report' :
240 hideMe(DOM.oils_rpt_folder_table_right_td);
241 unHideMe(DOM.oils_rpt_folder_table_alt_td);
242 unHideMe(DOM.oils_rpt_editor_div);
243 new oilsRptReportEditor(new oilsReport(objs[0]), this);
245 case 'delete_report' :
246 if(!confirmId('oils_rpt_verify_report_delete')) return;
247 this.deleteReports(objs, 0, successCallback);
250 case 'delete_template' :
251 if(!confirmId('oils_rpt_verify_template_delete')) return;
252 this.deleteTemplates(objs, 0, successCallback);
256 this.showOutput(objs[0]);
259 case 'delete_output':
260 if(!confirmId('oils_rpt_folder_contents_confirm_delete')) return;
261 this.deleteOutputs(objs,0, successCallback);
264 case 'move_template':
265 this.changeBatchFolder(objs, 'template', successCallback);
269 this.changeBatchFolder(objs, 'report', successCallback);
273 this.changeBatchFolder(objs, 'output', successCallback);
276 case 'clone_template':
277 this.cloneTemplate(objs[0]);
281 oilsRptFolderWindow.prototype.changeBatchFolder = function(objs, type, callback) {
282 hideMe(DOM.oils_rpt_folder_window_contents_table);
283 unHideMe(DOM.oils_rpt_move_folder_div)
285 this.drawFolderOptions(type,
287 obj.changeFolderList(objs, type, folderid, 0, callback);
288 hideMe(DOM.oils_rpt_move_folder_div)
289 unHideMe(DOM.oils_rpt_folder_window_contents_table);
294 oilsRptFolderWindow.prototype.cloneTemplate = function(template) {
295 hideMe(DOM.oils_rpt_folder_window_contents_table);
296 unHideMe(DOM.oils_rpt_move_folder_div)
298 this.drawFolderOptions('template',
300 var s = location.search+'';
301 s = s.replace(/\&folder=\d+/g,'');
302 s = s.replace(/\&ct=\d+/g,'');
303 version = JSON2js(template.data()).version;
304 if(version && version >= 5) {
305 window.top.location.href = NG_CLONE_TEMPLATE_INTERFACE+'/'+folderid+'/'+template.id();
306 } else if(version && version >= 2) {
307 if (window.IAMBROWSER) {
308 window.top.location.href = NG_CLONE_LEGACY_TEMPLATE_INTERFACE+'/'+folderid+'/'+template.id();
310 _debug('entering new template building interface with template version ' + version);
311 goTo(OILS_TEMPLATE_INTERFACE+s+'&folder='+folderid+'&ct='+template.id());
314 if (window.IAMBROWSER) {
315 window.top.location.href = NG_CLONE_LEGACY_TEMPLATE_INTERFACE+'/'+folderid+'/'+template.id();
317 goTo(OILS_LEGACY_TEMPLATE_INTERFACE+s+'&folder='+folderid+'&ct='+template.id());
325 oilsRptFolderWindow.prototype.changeFolderList = function(list, type, folderid, idx, callback, errid) {
326 if( idx >= list.length ) return callback(errid);
327 var item = list[idx];
329 var rcback = function(){obj.changeFolderList(list,type,folderid,++idx,callback,errid)};
331 item.folder(folderid);
335 oilsRptUpdateTemplate(item,rcback);
338 oilsRptUpdateReport(item,rcback);
341 oilsRptUpdateSchedule(item,rcback);
346 oilsRptFolderWindow.prototype.drawFolderOptions = function(type, callback) {
347 //var oilsRptChangeFolderTree;
351 DOM.oils_rpt_move_folder_picker,
353 rpt_strings.FOLDER_WINDOW_CHANGE_FOLDERS,
355 appendClear(DOM.oils_rpt_move_folder_selected, node.folder.name());
356 selectedFolder = node.folder.id();
360 DOM.oils_rpt_change_folder_submit.onclick = function() {
361 if(selectedFolder) callback(selectedFolder);
364 DOM.oils_rpt_change_folder_cancel.onclick = function() {
365 hideMe(DOM.oils_rpt_move_folder_div)
366 unHideMe(DOM.oils_rpt_folder_window_contents_table);
371 oilsRptFolderWindow.prototype.deleteOutputs = function(list, idx, callback, errid) {
372 if( idx >= list.length ) return callback(errid);
373 var output = list[idx];
375 if( output.runner().id() != USER.id() ) {
376 this.deleteOutputs(list, ++idx,
377 callback, 'oils_rpt_folder_contents_no_delete');
380 _debug('deleting output ' + output.id());
381 var req = new Request(OILS_RPT_DELETE_SCHEDULE,SESSION,output.id());
383 req.callback(function(){obj.deleteOutputs(list, ++idx, callback, errid);});
388 oilsRptFolderWindow.prototype.showOutput = function(sched) {
389 oilsRptFetchReport(sched.report().id(),
391 var url = oilsRptBuildOutputLink(r.template(), r.id(), sched.id());
392 _debug("launching report output view at URL: " + url);
393 if(isXUL() && !window.IAMBROWSER)
394 xulG.new_tab(xulG.url_prefix('XUL_REMOTE_BROWSER?url=') + url,
395 {tab_name: dojo.string.substitute( rpt_strings.FOLDER_WINDOW_REPORT_OUTPUT, [r.name()] ), browser:false},
396 {no_xulG:false, show_nav_buttons:true, show_print_button:true});
399 var win = window.open(url,r.name(), 'resizable,width=800,height=600,scrollbars=1');
406 oilsRptFolderWindow.prototype.deleteReports = function(list, idx, callback, errid) {
407 if( idx >= list.length ) return callback(errid);
408 var report = list[idx];
411 if( report.owner().id() != USER.id() ) {
412 this.deleteReports(list, ++idx,
413 callback, 'oils_rpt_folder_contents_no_delete');
417 // var req0 = new Request(OILS_RPT_REPORT_HAS_OUTS, SESSION, report.id());
420 // var r0es = r0.getResultObject();
421 // if( r0es != '0' ) {
422 // obj.deleteReports(list, ++idx,
423 // callback, 'oils_rpt_folder_contents_report_no_delete');
425 _debug('deleting report ' + report.id());
426 var req = new Request(OILS_RPT_DELETE_REPORT, SESSION, report.id());
427 req.callback(function(r) {
428 var res = r.getResultObject();
429 if( res == 0 ) return oilsRptAlertFailure();
430 obj.deleteReports(list, ++idx, callback, errid)
441 oilsRptFolderWindow.prototype.deleteTemplates = function(list, idx, callback, errid) {
442 if( idx >= list.length ) return callback(errid);
443 var tmpl = list[idx];
446 if( tmpl.owner().id() != USER.id() ) {
447 this.deleteTemplates(list, ++idx,
448 callback, 'oils_rpt_folder_contents_no_delete');
453 // var req0 = new Request( OILS_RPT_TEMPLATE_HAS_RPTS, SESSION, tmpl.id() );
456 // var resp = r0.getResultObject();
458 // if( resp != '0' ) {
459 // obj.deleteTemplates(list, ++idx,
460 // callback, 'oils_rpt_folder_contents_template_no_delete');
463 _debug('deleting template ' + tmpl.id());
464 var req = new Request(OILS_RPT_DELETE_TEMPLATE, SESSION, tmpl.id());
465 req.callback(function(r) {
466 var res = r.getResultObject();
467 if( res == 0 ) return oilsRptAlertFailure();
468 if( res == 1 ) errid = 'oils_rpt_folder_contents_template_no_delete';
469 obj.deleteTemplates(list, ++idx, callback, errid)
481 oilsRptFolderWindow.prototype.drawFolderDetails = function() {
482 appendClear(DOM.oils_rpt_folder_creator_label,
483 text(this.folderNode.folder.owner().usrname()));
484 appendClear(DOM.oils_rpt_folder_name_label,
485 text(this.folderNode.folder.name()));
489 oilsRptFolderWindow.prototype.fetchFolderData = function(callback) {
491 hideMe(DOM.oils_rpt_content_count_row_2);
492 hideMe(DOM.oils_rpt_content_row_2);
494 removeChildren(this.selector);
495 var req = new Request(OILS_RPT_FETCH_FOLDER_DATA,
496 SESSION, this.type, this.folderNode.folder.id(), oilsRptOutputLimit);
498 hideMe(DOM.oils_rpt_pending_output);
500 if(this.type == 'output') {
501 unHideMe(DOM.oils_rpt_pending_output);
502 /* first fetch the non-complete schedules */
503 req = new Request(OILS_RPT_FETCH_OUTPUT,
504 SESSION, this.folderNode.folder.id(), oilsRptOutputLimit, 0);
508 removeChildren(obj.selector);
511 var res = r.getResultObject();
513 if( res.length == 0 ) {
514 //hideMe(DOM.oils_rpt_content_count_row); /* this also hides the new-template link.. fix me */
515 hideMe(DOM.oils_rpt_content_row);
516 unHideMe(DOM.oils_rpt_content_row_empty);
518 unHideMe(DOM.oils_rpt_content_count_row);
519 unHideMe(DOM.oils_rpt_content_row);
520 hideMe(DOM.oils_rpt_content_row_empty);
523 if( obj.type == 'output' ) {
524 obj.fleshSchedules(res, 0, obj.selector);
528 obj.fmTable = drawFMObjectTable(
533 selectColName : rpt_strings.FOLDER_WINDOW_COLNAME_SELECT,
534 selectAllName : rpt_strings.FOLDER_WINDOW_COLNAME_ALL,
535 selectNoneName : rpt_strings.FOLDER_WINDOW_COLNAME_NONE
543 if( this.type != 'output' ) return;
546 unHideMe(DOM.oils_rpt_content_count_row_2);
547 unHideMe(DOM.oils_rpt_content_row_2);
550 /* now fetch the completed schedules */
551 req = new Request(OILS_RPT_FETCH_OUTPUT,
552 SESSION, this.folderNode.folder.id(), oilsRptOutputLimit2, 1);
554 _debug("TRYING: fleshing finished scheds with div: " + DOM.oils_rpt_folder_contents_selector_2);
555 removeChildren(DOM.oils_rpt_folder_contents_selector_2);
558 var res = r.getResultObject();
560 if( res.length == 0 ) {
561 hideMe(DOM.oils_rpt_content_count_row_2);
562 hideMe(DOM.oils_rpt_content_row_2);
564 unHideMe(DOM.oils_rpt_content_count_row_2);
565 unHideMe(DOM.oils_rpt_content_row_2);
568 _debug("fleshing finished scheds with div: " + DOM.oils_rpt_folder_contents_selector_2);
569 obj.fleshSchedules(res, 0, DOM.oils_rpt_folder_contents_selector_2, true);
576 oilsRptFolderWindow.prototype.fleshSchedules = function(list, idx, selector, isSecond) {
578 if( idx >= list.length ) return;
580 var sched = list[idx];
583 oilsRptFetchUser(sched.runner(),
587 oilsRptFetchTemplate(sched.report().template(),
590 sched.report().template(template);
592 _debug("drawing schedule with output: "+selector);
593 var t = drawFMObjectTable(
598 selectColName : rpt_strings.FOLDER_WINDOW_COLNAME_SELECT,
599 selectAllName : rpt_strings.FOLDER_WINDOW_COLNAME_ALL,
600 selectNoneName : rpt_strings.FOLDER_WINDOW_COLNAME_NONE
604 if( isSecond ) obj.fmTable2 = t;
605 else obj.fmTable = t;
608 //obj.fmTable.add(sched);
609 if( isSecond ) obj.fmTable2.add(sched);
610 else obj.fmTable.add(sched);
613 obj.fleshSchedules(list, ++idx, selector, isSecond);
621 oilsRptFolderWindow.prototype.setSelected = function(folderNode) {
622 this.selectedFolder = folderNode;
625 oilsRptFolderWindow.prototype.setFolderEditActions = function() {
626 var folder = this.folderNode.folder;
629 DOM.oils_rpt_folder_manager_name_input.value = folder.name();
630 DOM.oils_rpt_folder_manager_change_name_submit.onclick = function() {
631 var name = DOM.oils_rpt_folder_manager_name_input.value;
634 if(confirmId('oils_rpt_folder_manager_change_name_confirm')) {
635 oilsRptUpdateFolder(folder, obj.type,
638 oilsRptAlertSuccess();
639 oilsRptCurrentFolderManager.draw();
647 DOM.oils_rpt_folder_manager_sub_lib_create.onclick = function() {
650 if( obj.type == 'report' ) folder = new rrf();
651 if( obj.type == 'template' ) folder = new rtf();
652 if( obj.type == 'output' ) folder = new rof();
654 folder.owner(USER.id());
655 folder.parent(obj.folderNode.folder.id());
656 folder.name(DOM.oils_rpt_folder_manager_sub_name.value);
657 var shared = getSelectorVal(DOM.oils_rpt_folder_manager_sub_shared);
658 folder.shared( (shared == 'yes') ? 't' : 'f');
659 if( folder.shared() == 't' )
660 folder.share_with( obj.myOrgSelector.getValue() );
662 oilsRptCreateFolder(folder, obj.type,
665 oilsRptAlertSuccess();
666 oilsRptCurrentFolderManager.draw();
674 oilsRptFolderWindow.prototype.doFolderDelete = function() {
676 var cache = oilsRptFolderNodeCache[this.type];
677 /* let's see if this folder has any children */
678 for( var c in cache )
679 if( cache[c].folder.parent() == this.folderNode.folder.id() )
680 return alertId('oils_rpt_folder_cannot_delete');
682 /* lets see if the folder has contents */
683 var req = new Request(OILS_RPT_FETCH_FOLDER_DATA,
684 SESSION, this.type, this.folderNode.folder.id(), 1);
686 if(this.type == 'output') {
687 req = new Request(OILS_RPT_FETCH_OUTPUT,
688 SESSION, this.folderNode.folder.id(), 1);
697 var contents = r.getResultObject();
698 if( contents.length > 0 )
699 return alertId('oils_rpt_folder_cannot_delete');
701 if( confirmId('oils_rpt_folder_manager_delete_confirm') ) {
702 var req2 = new Request(OILS_RPT_DELETE_FOLDER,
703 SESSION, obj.type, obj.folderNode.folder.id());
707 var res = r2.getResultObject();
709 oilsRptAlertSuccess();
710 oilsRptCurrentFolderManager.draw();
712 else alert('error: '+js2JSON(res));
722 function oilsRptViewEditReport(report, readonly) {
725 var folderWindow = oilsRptFolderWindow.folderIdMap[report.folder()];
727 var req = new Request(
728 'open-ils.reporter:open-ils.reporter.report.fleshed.retrieve',
732 req.callback(function(r) {
734 hideMe(DOM.oils_rpt_folder_table_right_td);
735 unHideMe(DOM.oils_rpt_folder_table_alt_td);
736 unHideMe(DOM.oils_rpt_editor_div);
738 report = r.getResultObject();
740 new oilsRptReportEditor(
741 new oilsReport(report.template(), report), folderWindow, readonly);
747 function oilsRptViewReport(report) {
748 oilsRptViewEditReport(report, true);
751 function oilsRptEditReport(report) {
752 oilsRptViewEditReport(report);