1 dojo.requireLocalization("openils.reports", "reports");
3 var rpt_strings = dojo.i18n.getLocalization("openils.reports", "reports");
4 var OILS_TEMPLATE_INTERFACE = 'xul/template_builder.xul';
5 var OILS_LEGACY_TEMPLATE_INTERFACE = 'oils_rpt_builder.xhtml';
8 /* generic folder window class */
9 oilsRptSetSubClass('oilsRptFolderWindow', 'oilsRptObject');
10 function oilsRptFolderWindow(type, folderId) {
12 var node = oilsRptCurrentFolderManager.findNode(type, folderId);
13 this.selector = DOM.oils_rpt_folder_contents_selector;
14 this.folderNode = node;
19 oilsRptFolderWindow.prototype.draw = function() {
21 _debug('drawing folder window for ' + this.folderNode.folder.name() );
24 setSelector(DOM.oils_rpt_output_limit_selector, oilsRptOutputLimit);
25 setSelector(DOM.oils_rpt_output_limit_selector_2, oilsRptOutputLimit2);
27 DOM.oils_rpt_output_limit_selector.onchange = function() {
28 oilsRptOutputLimit = getSelectorVal(DOM.oils_rpt_output_limit_selector);
32 DOM.oils_rpt_output_limit_selector_2.onchange = function() {
33 oilsRptOutputLimit2 = getSelectorVal(DOM.oils_rpt_output_limit_selector_2);
37 var mine = ( this.folderNode.folder.owner().id() == USER.id() );
39 _debug('drawing folder window with type '+this.type);
40 if(mine) _debug('folder is mine...');
42 if( mine && this.type == 'template')
43 unHideMe(DOM.oils_rpt_folder_window_contents_new_template.parentNode);
44 else hideMe(DOM.oils_rpt_folder_window_contents_new_template.parentNode);
46 unHideMe(DOM.oils_rpt_folder_window_contents_div);
47 hideMe(DOM.oils_rpt_folder_manager_div);
48 hideMe(DOM.oils_rpt_top_folder);
50 DOM.oils_rpt_folder_window_manage_tab.onclick = function() {
51 unHideMe(DOM.oils_rpt_folder_window_contents_div);
52 hideMe(DOM.oils_rpt_folder_manager_div);
54 DOM.oils_rpt_folder_window_edit_tab.onclick = function() {
55 hideMe(DOM.oils_rpt_folder_window_contents_div);
56 unHideMe(DOM.oils_rpt_folder_manager_div);
59 this.setFolderEditActions();
61 hideMe(DOM.oils_rpt_template_folder_new_report);
62 unHideMe(DOM.oils_rpt_folder_table_right_td);
63 hideMe(DOM.oils_rpt_folder_table_alt_td);
64 this.drawFolderDetails();
66 DOM.oils_rpt_folder_content_action_go.onclick =
67 function() {obj.doFolderAction()}
69 this.fetchFolderData();
71 var sel = DOM.oils_rpt_folder_contents_action_selector;
73 for( var i = 0; i < sel.options.length; i++ ) {
74 var opt = sel.options[i];
76 if( !mine && opt.getAttribute('value').match(/move/) ) {
81 if( opt.getAttribute('type') == this.type ) {
82 if(x && !opt.disabled) {
90 this.drawEditActions();
92 var porg = PERMS.SHARE_REPORT_FOLDER;
94 DOM.oils_rpt_folder_manager_share_opt.disabled = true;
97 oilsRptFolderWindow.prototype.drawEditActions = function() {
99 DOM.oils_rpt_folder_window_contents_new_template.onclick = function() {
100 var s = location.search+'';
101 s = s.replace(/\&folder=\d+/g,'');
102 s = s.replace(/\&ct=\d+/g,'');
103 goTo( OILS_TEMPLATE_INTERFACE+s+'&folder='+obj.folderNode.folder.id());
107 if( this.folderNode.folder.owner().id() != USER.id() )
108 hideMe(DOM.oils_rpt_folder_manager_tab_table);
110 unHideMe(DOM.oils_rpt_folder_manager_tab_table);
112 if( isTrue(this.folderNode.folder.shared())) {
113 DOM.oils_rpt_folder_manager_share_opt.disabled = true;
114 DOM.oils_rpt_folder_manager_unshare_opt.disabled = false;
116 DOM.oils_rpt_folder_manager_share_opt.disabled = false;
117 DOM.oils_rpt_folder_manager_unshare_opt.disabled = true;
120 this.hideFolderActions();
123 DOM.oils_rpt_folder_manager_actions_submit.onclick = function() {
124 var act = getSelectorVal(DOM.oils_rpt_folder_manager_actions);
125 _debug("doing folder action: " + act);
126 obj.hideFolderActions();
129 unHideMe(DOM.oils_rpt_folder_manager_change_name_div);
131 case 'create_sub_folder':
132 var porg = PERMS.SHARE_REPORT_FOLDER;
134 DOM.oils_rpt_folder_manager_sub_shared.disabled = true;
135 removeChildren(DOM.oils_rpt_folder_manager_sub_lib_picker);
136 unHideMe(DOM.oils_rpt_folder_manager_create_sub);
137 obj.myOrgSelector = new oilsRptMyOrgsWidget(
138 DOM.oils_rpt_folder_manager_sub_lib_picker, USER.ws_ou(), porg)
139 obj.myOrgSelector.draw();
142 obj.doFolderDelete();
156 oilsRptFolderWindow.prototype.shareFolder = function() {
157 var folder = this.folderNode.folder;
158 if(isTrue(folder.shared()))
159 return alertId('oils_rpt_folder_already_shared');
160 unHideMe(DOM.oils_rpt_folder_manager_share_div);
163 var orgsel = new oilsRptMyOrgsWidget(
164 DOM.oils_rpt_folder_manager_share_lib_picker,
165 USER.ws_ou(), PERMS.SHARE_REPORT_FOLDER);
168 var type = this.type;
169 DOM.oils_rpt_folder_manager_share_submit.onclick = function() {
171 folder.share_with(orgsel.getValue());
172 oilsRptUpdateFolder( folder, type,
175 oilsRptAlertSuccess();
176 oilsRptCurrentFolderManager.draw();
183 oilsRptFolderWindow.prototype.unShareFolder = function() {
184 var folder = this.folderNode.folder;
185 if(!isTrue(folder.shared()))
186 return alertId('oils_rpt_folder_already_unshared');
187 if(!confirmId('oils_rpt_folder_unshare_confirm')) return;
189 var type = this.type;
190 oilsRptUpdateFolder( folder, type,
193 oilsRptAlertSuccess();
194 oilsRptCurrentFolderManager.draw();
201 oilsRptFolderWindow.prototype.hideFolderActions = function() {
202 hideMe(DOM.oils_rpt_folder_manager_change_name_div);
203 hideMe(DOM.oils_rpt_folder_manager_create_sub);
204 hideMe(DOM.oils_rpt_folder_manager_share_div);
208 oilsRptFolderWindow.prototype.doFolderAction = function() {
209 var objs = (this.fmTable) ? this.fmTable.getSelected() : [];
211 if( this.type == 'output' && this.fmTable2 )
212 objs = objs.concat( this.fmTable2.getSelected() );
214 if( objs.length == 0 )
215 return alert(rpt_strings.FOLDER_WINDOW_SELECT_ITEM);
216 var action = getSelectorVal(DOM.oils_rpt_folder_contents_action_selector);
219 var successCallback = function(errid) {
220 if(errid) alertId(errid)
221 else oilsRptAlertSuccess();
228 case 'create_report' :
229 hideMe(DOM.oils_rpt_folder_table_right_td);
230 unHideMe(DOM.oils_rpt_folder_table_alt_td);
231 unHideMe(DOM.oils_rpt_editor_div);
232 new oilsRptReportEditor(new oilsReport(objs[0]), this);
234 case 'delete_report' :
235 if(!confirmId('oils_rpt_verify_report_delete')) return;
236 this.deleteReports(objs, 0, successCallback);
239 case 'delete_template' :
240 if(!confirmId('oils_rpt_verify_template_delete')) return;
241 this.deleteTemplates(objs, 0, successCallback);
245 this.showOutput(objs[0]);
248 case 'delete_output':
249 if(!confirmId('oils_rpt_folder_contents_confirm_delete')) return;
250 this.deleteOutputs(objs,0, successCallback);
253 case 'move_template':
254 this.changeBatchFolder(objs, 'template', successCallback);
258 this.changeBatchFolder(objs, 'report', successCallback);
262 this.changeBatchFolder(objs, 'output', successCallback);
265 case 'clone_template':
266 this.cloneTemplate(objs[0]);
270 oilsRptFolderWindow.prototype.changeBatchFolder = function(objs, type, callback) {
271 hideMe(DOM.oils_rpt_folder_window_contents_table);
272 unHideMe(DOM.oils_rpt_move_folder_div)
274 this.drawFolderOptions(type,
276 obj.changeFolderList(objs, type, folderid, 0, callback);
277 hideMe(DOM.oils_rpt_move_folder_div)
278 unHideMe(DOM.oils_rpt_folder_window_contents_table);
283 oilsRptFolderWindow.prototype.cloneTemplate = function(template) {
284 hideMe(DOM.oils_rpt_folder_window_contents_table);
285 unHideMe(DOM.oils_rpt_move_folder_div)
287 this.drawFolderOptions('template',
289 var s = location.search+'';
290 s = s.replace(/\&folder=\d+/g,'');
291 s = s.replace(/\&ct=\d+/g,'');
292 version = JSON2js(template.data()).version;
293 if(version && version >= 2) {
294 _debug('entering new template building interface with template version ' + version);
295 goTo(OILS_TEMPLATE_INTERFACE+s+'&folder='+folderid+'&ct='+template.id());
297 goTo(OILS_LEGACY_TEMPLATE_INTERFACE+s+'&folder='+folderid+'&ct='+template.id());
304 oilsRptFolderWindow.prototype.changeFolderList = function(list, type, folderid, idx, callback, errid) {
305 if( idx >= list.length ) return callback(errid);
306 var item = list[idx];
308 var rcback = function(){obj.changeFolderList(list,type,folderid,++idx,callback,errid)};
310 item.folder(folderid);
314 oilsRptUpdateTemplate(item,rcback);
317 oilsRptUpdateReport(item,rcback);
320 oilsRptUpdateSchedule(item,rcback);
325 oilsRptFolderWindow.prototype.drawFolderOptions = function(type, callback) {
326 //var oilsRptChangeFolderTree;
330 DOM.oils_rpt_move_folder_picker,
332 rpt_strings.FOLDER_WINDOW_CHANGE_FOLDERS,
334 appendClear(DOM.oils_rpt_move_folder_selected, node.folder.name());
335 selectedFolder = node.folder.id();
339 DOM.oils_rpt_change_folder_submit.onclick = function() {
340 if(selectedFolder) callback(selectedFolder);
343 DOM.oils_rpt_change_folder_cancel.onclick = function() {
344 hideMe(DOM.oils_rpt_move_folder_div)
345 unHideMe(DOM.oils_rpt_folder_window_contents_table);
350 oilsRptFolderWindow.prototype.deleteOutputs = function(list, idx, callback, errid) {
351 if( idx >= list.length ) return callback(errid);
352 var output = list[idx];
354 if( output.runner().id() != USER.id() ) {
355 this.deleteOutputs(list, ++idx,
356 callback, 'oils_rpt_folder_contents_no_delete');
359 _debug('deleting output ' + output.id());
360 var req = new Request(OILS_RPT_DELETE_SCHEDULE,SESSION,output.id());
362 req.callback(function(){obj.deleteOutputs(list, ++idx, callback, errid);});
367 oilsRptFolderWindow.prototype.showOutput = function(sched) {
368 oilsRptFetchReport(sched.report().id(),
370 var url = oilsRptBuildOutputLink(r.template(), r.id(), sched.id());
371 _debug("launching report output view at URL: " + url);
373 xulG.new_tab(xulG.url_prefix('XUL_REMOTE_BROWSER?url=') + url,
374 {tab_name: dojo.string.substitute( rpt_strings.FOLDER_WINDOW_REPORT_OUTPUT, [r.name()] ), browser:false},
375 {no_xulG:false, show_nav_buttons:true, show_print_button:true});
378 var win = window.open(url,r.name(), 'resizable,width=800,height=600,scrollbars=1');
385 oilsRptFolderWindow.prototype.deleteReports = function(list, idx, callback, errid) {
386 if( idx >= list.length ) return callback(errid);
387 var report = list[idx];
390 if( report.owner().id() != USER.id() ) {
391 this.deleteReports(list, ++idx,
392 callback, 'oils_rpt_folder_contents_no_delete');
396 // var req0 = new Request(OILS_RPT_REPORT_HAS_OUTS, SESSION, report.id());
399 // var r0es = r0.getResultObject();
400 // if( r0es != '0' ) {
401 // obj.deleteReports(list, ++idx,
402 // callback, 'oils_rpt_folder_contents_report_no_delete');
404 _debug('deleting report ' + report.id());
405 var req = new Request(OILS_RPT_DELETE_REPORT, SESSION, report.id());
406 req.callback(function(r) {
407 var res = r.getResultObject();
408 if( res == 0 ) return oilsRptAlertFailure();
409 obj.deleteReports(list, ++idx, callback, errid)
420 oilsRptFolderWindow.prototype.deleteTemplates = function(list, idx, callback, errid) {
421 if( idx >= list.length ) return callback(errid);
422 var tmpl = list[idx];
425 if( tmpl.owner().id() != USER.id() ) {
426 this.deleteTemplates(list, ++idx,
427 callback, 'oils_rpt_folder_contents_no_delete');
432 // var req0 = new Request( OILS_RPT_TEMPLATE_HAS_RPTS, SESSION, tmpl.id() );
435 // var resp = r0.getResultObject();
437 // if( resp != '0' ) {
438 // obj.deleteTemplates(list, ++idx,
439 // callback, 'oils_rpt_folder_contents_template_no_delete');
442 _debug('deleting template ' + tmpl.id());
443 var req = new Request(OILS_RPT_DELETE_TEMPLATE, SESSION, tmpl.id());
444 req.callback(function(r) {
445 var res = r.getResultObject();
446 if( res == 0 ) return oilsRptAlertFailure();
447 obj.deleteTemplates(list, ++idx, callback, errid)
459 oilsRptFolderWindow.prototype.drawFolderDetails = function() {
460 appendClear(DOM.oils_rpt_folder_creator_label,
461 text(this.folderNode.folder.owner().usrname()));
462 appendClear(DOM.oils_rpt_folder_name_label,
463 text(this.folderNode.folder.name()));
467 oilsRptFolderWindow.prototype.fetchFolderData = function(callback) {
469 hideMe(DOM.oils_rpt_content_count_row_2);
470 hideMe(DOM.oils_rpt_content_row_2);
472 removeChildren(this.selector);
473 var req = new Request(OILS_RPT_FETCH_FOLDER_DATA,
474 SESSION, this.type, this.folderNode.folder.id(), oilsRptOutputLimit);
476 hideMe(DOM.oils_rpt_pending_output);
478 if(this.type == 'output') {
479 unHideMe(DOM.oils_rpt_pending_output);
480 /* first fetch the non-complete schedules */
481 req = new Request(OILS_RPT_FETCH_OUTPUT,
482 SESSION, this.folderNode.folder.id(), oilsRptOutputLimit, 0);
486 removeChildren(obj.selector);
489 var res = r.getResultObject();
491 if( res.length == 0 ) {
492 //hideMe(DOM.oils_rpt_content_count_row); /* this also hides the new-template link.. fix me */
493 hideMe(DOM.oils_rpt_content_row);
494 unHideMe(DOM.oils_rpt_content_row_empty);
496 unHideMe(DOM.oils_rpt_content_count_row);
497 unHideMe(DOM.oils_rpt_content_row);
498 hideMe(DOM.oils_rpt_content_row_empty);
501 if( obj.type == 'output' ) {
502 obj.fleshSchedules(res, 0, obj.selector);
506 obj.fmTable = drawFMObjectTable(
511 selectColName : rpt_strings.FOLDER_WINDOW_COLNAME_SELECT,
512 selectAllName : rpt_strings.FOLDER_WINDOW_COLNAME_ALL,
513 selectNoneName : rpt_strings.FOLDER_WINDOW_COLNAME_NONE
521 if( this.type != 'output' ) return;
524 unHideMe(DOM.oils_rpt_content_count_row_2);
525 unHideMe(DOM.oils_rpt_content_row_2);
528 /* now fetch the completed schedules */
529 req = new Request(OILS_RPT_FETCH_OUTPUT,
530 SESSION, this.folderNode.folder.id(), oilsRptOutputLimit2, 1);
532 _debug("TRYING: fleshing finished scheds with div: " + DOM.oils_rpt_folder_contents_selector_2);
533 removeChildren(DOM.oils_rpt_folder_contents_selector_2);
536 var res = r.getResultObject();
538 if( res.length == 0 ) {
539 hideMe(DOM.oils_rpt_content_count_row_2);
540 hideMe(DOM.oils_rpt_content_row_2);
542 unHideMe(DOM.oils_rpt_content_count_row_2);
543 unHideMe(DOM.oils_rpt_content_row_2);
546 _debug("fleshing finished scheds with div: " + DOM.oils_rpt_folder_contents_selector_2);
547 obj.fleshSchedules(res, 0, DOM.oils_rpt_folder_contents_selector_2, true);
554 oilsRptFolderWindow.prototype.fleshSchedules = function(list, idx, selector, isSecond) {
556 if( idx >= list.length ) return;
558 var sched = list[idx];
561 oilsRptFetchUser(sched.runner(),
565 oilsRptFetchTemplate(sched.report().template(),
568 sched.report().template(template);
570 _debug("drawing schedule with output: "+selector);
571 var t = drawFMObjectTable(
576 selectColName : rpt_strings.FOLDER_WINDOW_COLNAME_SELECT,
577 selectAllName : rpt_strings.FOLDER_WINDOW_COLNAME_ALL,
578 selectNoneName : rpt_strings.FOLDER_WINDOW_COLNAME_NONE
582 if( isSecond ) obj.fmTable2 = t;
583 else obj.fmTable = t;
586 //obj.fmTable.add(sched);
587 if( isSecond ) obj.fmTable2.add(sched);
588 else obj.fmTable.add(sched);
591 obj.fleshSchedules(list, ++idx, selector, isSecond);
599 oilsRptFolderWindow.prototype.setSelected = function(folderNode) {
600 this.selectedFolder = folderNode;
603 oilsRptFolderWindow.prototype.setFolderEditActions = function() {
604 var folder = this.folderNode.folder;
607 DOM.oils_rpt_folder_manager_name_input.value = folder.name();
608 DOM.oils_rpt_folder_manager_change_name_submit.onclick = function() {
609 var name = DOM.oils_rpt_folder_manager_name_input.value;
612 if(confirmId('oils_rpt_folder_manager_change_name_confirm')) {
613 oilsRptUpdateFolder(folder, obj.type,
616 oilsRptAlertSuccess();
617 oilsRptCurrentFolderManager.draw();
625 DOM.oils_rpt_folder_manager_sub_lib_create.onclick = function() {
628 if( obj.type == 'report' ) folder = new rrf();
629 if( obj.type == 'template' ) folder = new rtf();
630 if( obj.type == 'output' ) folder = new rof();
632 folder.owner(USER.id());
633 folder.parent(obj.folderNode.folder.id());
634 folder.name(DOM.oils_rpt_folder_manager_sub_name.value);
635 var shared = getSelectorVal(DOM.oils_rpt_folder_manager_sub_shared);
636 folder.shared( (shared == 'yes') ? 't' : 'f');
637 if( folder.shared() == 't' )
638 folder.share_with( obj.myOrgSelector.getValue() );
640 oilsRptCreateFolder(folder, obj.type,
643 oilsRptAlertSuccess();
644 oilsRptCurrentFolderManager.draw();
652 oilsRptFolderWindow.prototype.doFolderDelete = function() {
654 var cache = oilsRptFolderNodeCache[this.type];
655 /* let's see if this folder has any children */
656 for( var c in cache )
657 if( cache[c].folder.parent() == this.folderNode.folder.id() )
658 return alertId('oils_rpt_folder_cannot_delete');
660 /* lets see if the folder has contents */
661 var req = new Request(OILS_RPT_FETCH_FOLDER_DATA,
662 SESSION, this.type, this.folderNode.folder.id(), 1);
664 if(this.type == 'output') {
665 req = new Request(OILS_RPT_FETCH_OUTPUT,
666 SESSION, this.folderNode.folder.id(), 1);
675 var contents = r.getResultObject();
676 if( contents.length > 0 )
677 return alertId('oils_rpt_folder_cannot_delete');
679 if( confirmId('oils_rpt_folder_manager_delete_confirm') ) {
680 var req2 = new Request(OILS_RPT_DELETE_FOLDER,
681 SESSION, obj.type, obj.folderNode.folder.id());
685 var res = r2.getResultObject();
687 oilsRptAlertSuccess();
688 oilsRptCurrentFolderManager.draw();
690 else alert('error: '+js2JSON(res));